first commit

This commit is contained in:
2019-06-15 00:07:10 -04:00
commit bf7e6628c4
230 changed files with 122232 additions and 0 deletions
+87
View File
@@ -0,0 +1,87 @@
# Project Title
One Paragraph of project description goes here
## Getting Started
These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. See deployment for notes on how to deploy the project on a live system.
### Prerequisites
What things you need to install the software and how to install them
```
Give examples
```
### Installing
A step by step series of examples that tell you how to get a development env running
Say what the step will be
```
Give the example
```
And repeat
```
until finished
```
End with an example of getting some data out of the system or using it for a little demo
## Running the tests
Explain how to run the automated tests for this system
### Break down into end to end tests
Explain what these tests test and why
```
Give an example
```
### And coding style tests
Explain what these tests test and why
```
Give an example
```
## Deployment
Add additional notes about how to deploy this on a live system
## Built With
* [Dropwizard](http://www.dropwizard.io/1.0.2/docs/) - The web framework used
* [Maven](https://maven.apache.org/) - Dependency Management
* [ROME](https://rometools.github.io/rome/) - Used to generate RSS Feeds
## Contributing
Please read [CONTRIBUTING.md](https://gist.github.com/PurpleBooth/b24679402957c63ec426) for details on our code of conduct, and the process for submitting pull requests to us.
## Versioning
We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [tags on this repository](https://github.com/your/project/tags).
## Authors
* **Billie Thompson** - *Initial work* - [PurpleBooth](https://github.com/PurpleBooth)
See also the list of [contributors](https://github.com/your/project/contributors) who participated in this project.
## License
This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details
## Acknowledgments
* Hat tip to anyone whose code was used
* Inspiration
* etc
View File
View File
Vendored Executable
+37
View File
@@ -0,0 +1,37 @@
#!/bin/sh
#
BUILD_DIR=`dirname $0`
# Get jubabox_api root directory
cd ..
WORK_DIR=`pwd`
MAILSEND="$WORK_DIR/src/mailsend"
LIBCONFIG="$WORK_DIR/src/libconfig-1.3.1"
# Checking user
if [ "$USER" = "root" ]
then
echo "Configuring as root"
LIBCONFIG_PREFIX="/usr"
echo "Building $LIBCONFIG ..."
cd $LIBCONFIG
#echo `pwd` $LIBCONFIG_PREFIX
CFLAGS=-fPIC CXXFLAGS=-fPIC ./configure --prefix=$LIBCONFIG_PREFIX
make
make install
fi
mkdir $WORK_DIR/logs
chmod a+w $WORK_DIR/logs
mkdir $WORK_DIR/src/modules
# Building mailsend
cd $MAILSEND
make
# Configure extension
cd $WORK_DIR/src/
# Generate extension
phpize
./configure --enable-jubabox_api
echo "done."
cd $BUILD_DIR
echo $BUILD_DIR
echo $WORK_DIR
echo $USER
@@ -0,0 +1,220 @@
Subject: JubaBox Signup ALERT
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>JubaBox Signup ALERT</title>
<style type="text/css">
body {margin: 0; padding: 0; min-width: 100%!important;}
img {height: auto;}
.content {width: 100%; max-width: 600px;}
.header {padding: 40px 30px 20px 30px;}
.innerpadding {padding: 30px 30px 30px 30px;}
.borderbottom {border-bottom: 1px solid #f2eeed;}
.subhead {font-size: 12px; color: #ffffff; font-family: sans-serif; letter-spacing: 3px;}
.h1, .h2, .bodycopy {color: #153643; font-family: sans-serif;}
.h1 {font-size: 33px; line-height: 38px; font-weight: bold;}
.h2 {padding: 0 0 15px 0; font-size: 24px; line-height: 28px; font-weight: bold;}
.bodycopy {font-size: 14px; line-height: 20px;}
.button {text-align: center; font-size: 16px; font-family: sans-serif; font-weight: bold; padding: 0 30px 0 30px;}
.button a {color: #ffffff; text-decoration: none;}
.footer {padding: 20px 30px 15px 30px;}
.footercopy {font-family: sans-serif; font-size: 14px; color: #ffffff;}
.footercopy a {color: #ffffff; text-decoration: underline;}
@media only screen and (max-width: 550px), screen and (max-device-width: 550px) {
body[yahoo] .hide {display: none!important;}
body[yahoo] .buttonwrapper {background-color: transparent!important;}
body[yahoo] .button {padding: 0px!important;}
body[yahoo] .button a {background-color: #e05443; padding: 15px 15px 13px!important;}
body[yahoo] .unsubscribe {display: block; margin-top: 20px; padding: 10px 50px; background: #2f3942; border-radius: 5px; text-decoration: none!important; font-weight: bold;}
}
/*@media only screen and (min-device-width: 601px) {
.content {width: 600px !important;}
.col425 {width: 425px!important;}
.col380 {width: 380px!important;}
}*/
</style>
</head>
<body yahoo bgcolor="#f6f8f1">
<table width="100%" bgcolor="#f6f8f1" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<!--[if (gte mso 9)|(IE)]>
<table width="600" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table bgcolor="#ffffff" class="content" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td bgcolor="#c7d8a7" class="header">
<table width="70" align="left" border="0" cellpadding="0" cellspacing="0">
<tr>
<td height="70" style="padding: 0 20px 20px 0;">
<img class="fix" src="https://{{server_name}}/assets/images/jubabox-icon.gif" width="70" height="70" border="0" alt="JubaBox" />
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
<table width="425" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%; max-width: 425px;">
<tr>
<td height="50">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h1" style="padding: 5px 0 0 0;">
{{site_name}}
</td>
</tr>
<tr>
<td class="subhead" style="padding: 0 0 0 3px;">
{{site_trade_name}}
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<table width="115" align="left" border="0" cellpadding="0" cellspacing="0">
<tr>
<td height="115" style="padding: 0 20px 20px 0;">
<img class="fix" src="https://{{server_name}}/assets/images/article1.png" width="115" height="115" border="0" alt="" />
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
<table width="380" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col380" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%; max-width: 380px;">
<tr>
<td>
<table width="100%" border="0" cellspacing="1" cellpadding="0" class="bodycopy" style="font-size: 14px; font-family: sans-serif; border: 1px solid #f2eeed; background-color:#e6f9ff;">
<tr >
<td colspan="2"><h3>Signup Pending-{{added}}</h3></td>
</tr>
<tr >
<td class="left" style="width:100px">Firstname</td>
<td class="bodycopy">{{firstname}}</td>
</tr>
<tr>
<td class="left" style="width:100px">Lastname</td>
<td class="bodycopy">{{lastname}}</td>
</tr>
<tr >
<td class="left" style="width:100px">Email</td>
<td class="bodycopy">{{email2}}</td>
</tr>
<tr >
<td class="left" style="width:100px">Location</td>
<td class="bodycopy"><a href="https://www.chiefsoft.com/tools/iplocator?ip={{loc}}">{{loc}}</td>
</tr>
<tr>
<td class="left" style="width:100px">Created</td>
<td class="bodycopy">{{added}}</td>
</tr>
<tr >
<td class="left" style="width:100px">Link</td>
<td class="bodycopy">{{verify_link}}</td>
</tr>
</table>
</td>
</tr>
<tr>
<td><h4>Please <a href ="https://{{server_name}}/bko">login</a> into BackOffice from authorized system to support the user.</h4>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<img class="fix" src="https://{{server_name}}/assets/images/jubabox_email_banner.jpg" width="100%" border="0" alt="" />
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
{{site_name}} Team
<br>
{{server_name}}
</td>
</tr>
<tr>
<td class="footer" bgcolor="#44525f">
<table width="100%" border="0" cellspacing="0" cellpadding="0" >
<tr>
<td align="center" class="footercopy">
&reg; {{site_name}} 2017<br/>
You received this email because you are a support user for {{site_name}}. If you get this email in error, please <a href="https://{{server_name}}/contactus" class="unsubscribe"><font color="#ffffff">contact</font></a> us.
</td>
</tr>
<tr>
<td align="center" style="padding: 20px 0 0 0;">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="https://www.facebook.com/jubabox/">
<img src="https://{{server_name}}/assets/images/brands/facebook.png" width="37" height="37" alt="Facebook" border="0" />
</a>
</td>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="https://twitter.com/jubabox">
<img src="https://{{server_name}}/assets/images/brands/twitter.png" width="37" height="37" alt="Twitter" border="0" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</table>
<!--analytics-->
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</body>
</html>
@@ -0,0 +1,180 @@
Subject: ALERT {{subject}}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{site_name}} - Transport Request</title>
<style type="text/css">
body {margin: 0; padding: 0; min-width: 100%!important;}
img {height: auto;}
.content {width: 100%; max-width: 600px;}
.header {padding: 20px 20px 20px 30px;}
.innerpadding {padding: 10px 10px 10px 10px;}
.borderbottom {border-bottom: 1px solid #f2eeed;}
.subhead {font-size: 12px; color: #ffffff; font-family: sans-serif; letter-spacing: 3px;}
.h1, .bodycopy {color: #153643; font-family: sans-serif;}
.h2 {color: #e6eeed; font-family: sans-serif;}
.h1 {font-size: 33px; line-height: 38px; font-weight: bold;}
.h2 {padding: 0 0 15px 0; font-size: 24px; line-height: 28px; font-weight: bold;}
.bodycopy {font-size: 14px; line-height: 20px;}
.button {text-align: center; font-size: 16px; font-family: sans-serif; font-weight: bold; padding: 0 20px 0 20px;}
.button a {color: #ffffff; text-decoration: none;}
.footer {padding: 20px 30px 15px 30px;}
.footercopy {font-family: sans-serif; font-size: 14px; color: #ffffff;}
.footercopy a {color: #ffffff; text-decoration: underline;}
</style>
</head>
<body yahoo bgcolor="#f6f8f1">
<table width="100%" bgcolor="#f6f8f1" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<!--[if (gte mso 9)|(IE)]>
<table width="600" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table bgcolor="#ffffff" class="content" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td bgcolor="#19b9b3" class="header">
<!--[if (gte mso 9)|(IE)]>
<table width="425" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%; max-width: 425px;">
<tr>
<td height="50">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h1" style="padding: 5px 0 0 0;">
{{site_name}}
</td>
</tr>
<tr>
<td class="subhead" style="padding: 0 0 0 3px;">
{{site_trade_name}}
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h3">
ALERT - {{site_name}},
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<!--[if (gte mso 9)|(IE)]>
<table width="100%" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%;">
<tr>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="bodycopy">
A laundry pickup with the details as shows below is now confirmed.
</td>
</tr>
<tr>
<td>
<table class="col425">
<tr><td><b>Date Time</b></td><td>{{long_date}}</td></tr>
<tr><td><b>Destination</b></td><td>{{agent_name}}<br>{{to_street}},{{to_city}},{{to_state}} {{to_zipcode}}</td></tr>
<tr><td><b>Origin</b></td><td>{{from_street}},{{from_city}},{{from_state}} {{from_zipcode}}</td></tr>
<tr><td><b>Request By</b></td><td>{{req_firstname}} {{req_lastname}}</td></tr>
<tr><td><b>Customer Name</b></td><td>{{firstname}} {{lastname}} {{patient_number}}</td></tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
.
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
{{site_name}} Team
<br>
{{server_name}}
</td>
</tr>
<tr>
<td class="footer" bgcolor="#493D26">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" class="footercopy">
&reg; {{site_name}} 2018<br/>
This is a support email from {{site_name}}.
</td>
</tr>
<tr>
<td align="center" style="padding: 20px 0 0 0;">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{facebook}}">
<img src="https://{{server_name}}/assets/images/brands/facebook.png" width="37" height="37" alt="Facebook" border="0" />
</a>
</td>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{twitter}}">
<img src="https://{{server_name}}/assets/images/brands/twitter.png" width="37" height="37" alt="Twitter" border="0" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</table>
<!--analytics-->
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</body>
</html>
@@ -0,0 +1,178 @@
Subject: ALERT {{subject}}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{site_name}} - Transport Request</title>
<style type="text/css">
body {margin: 0; padding: 0; min-width: 100%!important;}
img {height: auto;}
.content {width: 100%; max-width: 600px;}
.header {padding: 20px 20px 20px 30px;}
.innerpadding {padding: 10px 10px 10px 10px;}
.borderbottom {border-bottom: 1px solid #f2eeed;}
.subhead {font-size: 12px; color: #ffffff; font-family: sans-serif; letter-spacing: 3px;}
.h1, .bodycopy {color: #153643; font-family: sans-serif;}
.h2 {color: #e6eeed; font-family: sans-serif;}
.h1 {font-size: 33px; line-height: 38px; font-weight: bold;}
.h2 {padding: 0 0 15px 0; font-size: 24px; line-height: 28px; font-weight: bold;}
.bodycopy {font-size: 14px; line-height: 20px;}
.button {text-align: center; font-size: 16px; font-family: sans-serif; font-weight: bold; padding: 0 20px 0 20px;}
.button a {color: #ffffff; text-decoration: none;}
.footer {padding: 20px 30px 15px 30px;}
.footercopy {font-family: sans-serif; font-size: 14px; color: #ffffff;}
.footercopy a {color: #ffffff; text-decoration: underline;}
</style>
</head>
<body yahoo bgcolor="#f6f8f1">
<table width="100%" bgcolor="#f6f8f1" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<!--[if (gte mso 9)|(IE)]>
<table width="600" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table bgcolor="#ffffff" class="content" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td bgcolor="#19b9b3" class="header">
<!--[if (gte mso 9)|(IE)]>
<table width="425" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%; max-width: 425px;">
<tr>
<td height="50">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h1" style="padding: 5px 0 0 0;">
{{site_name}}
</td>
</tr>
<tr>
<td class="subhead" style="padding: 0 0 0 3px;">
{{site_trade_name}}
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h3">
ALERT- {{site_name}},
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<!--[if (gte mso 9)|(IE)]>
<table width="100%" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%;">
<tr>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="bodycopy">
We are unable to confirm a laundry pickup with the details as shows below.
</td>
</tr>
<tr>
<td>
<table class="col425">
<tr><td><b>Date Time</b></td><td>{{long_date}}</td></tr>
<tr><td><b>Destination</b></td><td>{{agent_name}}<br>{{to_street}},{{to_city}},{{to_state}} {{to_zipcode}}</td></tr>
<tr><td><b>Origin</b></td><td>{{from_street}},{{from_city}},{{from_state}} {{from_zipcode}}</td></tr>
<tr><td><b>Request By</b></td><td>{{req_firstname}} {{req_lastname}}</td></tr>
<tr><td><b>Customer Name</b></td><td>{{firstname}} {{lastname}} </td></tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
{{site_name}} Team
<br>
{{server_name}}
</td>
</tr>
<tr>
<td class="footer" bgcolor="#493D26">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" class="footercopy">
&reg; {{site_name}} 2018<br/>
This is a support email from {{site_name}}.
</td>
</tr>
<tr>
<td align="center" style="padding: 20px 0 0 0;">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{facebook}}">
<img src="https://{{server_name}}/assets/images/brands/facebook.png" width="37" height="37" alt="Facebook" border="0" />
</a>
</td>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{twitter}}">
<img src="https://{{server_name}}/assets/images/brands/twitter.png" width="37" height="37" alt="Twitter" border="0" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</table>
<!--analytics-->
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</body>
</html>
@@ -0,0 +1,183 @@
Subject: {{subject}}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{subject}}</title>
<style type="text/css">
body {margin: 0; padding: 0; min-width: 100%!important;}
img {height: auto;}
.content {width: 100%; max-width: 600px;}
.header {padding: 20px 20px 20px 30px;}
.innerpadding {padding: 10px 10px 10px 10px;}
.borderbottom {border-bottom: 1px solid #f2eeed;}
.subhead {font-size: 12px; color: #ffffff; font-family: sans-serif; letter-spacing: 3px;}
.h1, .bodycopy {color: #153643; font-family: sans-serif;}
.h2 {color: #e6eeed; font-family: sans-serif;}
.h1 {font-size: 33px; line-height: 38px; font-weight: bold;}
.h2 {padding: 0 0 15px 0; font-size: 24px; line-height: 28px; font-weight: bold;}
.bodycopy {font-size: 14px; line-height: 20px;}
.button {text-align: center; font-size: 16px; font-family: sans-serif; font-weight: bold; padding: 0 20px 0 20px;}
.button a {color: #ffffff; text-decoration: none;}
.footer {padding: 20px 30px 15px 30px;}
.footercopy {font-family: sans-serif; font-size: 14px; color: #ffffff;}
.footercopy a {color: #ffffff; text-decoration: underline;}
</style>
</head>
<body yahoo bgcolor="#f6f8f1">
<table width="100%" bgcolor="#f6f8f1" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<!--[if (gte mso 9)|(IE)]>
<table width="600" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table bgcolor="#ffffff" class="content" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td bgcolor="#19b9b3" class="header">
<!--[if (gte mso 9)|(IE)]>
<table width="425" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%; max-width: 425px;">
<tr>
<td height="50">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h1" style="padding: 5px 0 0 0;">
{{site_name}}
</td>
</tr>
<tr>
<td class="subhead" style="padding: 0 0 0 3px;">
{{site_trade_name}}
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h3">
KleenApp Team,
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<!--[if (gte mso 9)|(IE)]>
<table width="100%" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%;">
<tr>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="bodycopy">
Received a new service request - NOT CONFIRMED YET
</td>
</tr>
<tr>
<td>
<table class="col425">
<tr><td><b>Customer</b></td><td>{{firstname}} {{lastname}}</td></tr>
<tr><td><b>Date Time</b></td><td>{{long_date}}</td></tr>
<tr><td><b>Destination</b></td><td>{{agent_name}}<br>{{to_street}},{{to_city}},{{to_state}} {{to_zipcode}}</td></tr>
<tr><td><b>Origin</b></td><td>{{from_street}},{{from_city}},{{from_state}} {{from_zipcode}}</td></tr>
<tr><td><b>Request By</b></td><td>{{firstname}} {{lastname}}- {{customer_email}}</td></tr>
<tr><td><b>Service List </b></td><td>
<table border="0" width='100%' id="table1" style="font-family: Trebuchet MS; font-size: 10pt ">
<tr><th></th><th>Item</th><th>Quantity</th><th>Price</th></tr>
{{\inv_items}}
{{...}}
{{pin}}
{{/...}}
{{/inv_items}}
</table>
</td></tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
<tr>
<td class="innerpadding bodycopy">
{{site_name}} Team
<br>
{{server_name}}
</td>
</tr>
<tr>
<td class="footer" bgcolor="#493D26">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" class="footercopy">
&reg; {{site_name}} 2018<br/>
This is a support email from {{site_name}}.
</td>
</tr>
<tr>
<td align="center" style="padding: 20px 0 0 0;">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{facebook}}">
<img src="https://{{server_name}}/assets/images/brands/facebook.png" width="37" height="37" alt="Facebook" border="0" />
</a>
</td>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{twitter}}">
<img src="https://{{server_name}}/assets/images/brands/twitter.png" width="37" height="37" alt="Twitter" border="0" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</table>
<!--analytics-->
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</body>
</html>
+186
View File
@@ -0,0 +1,186 @@
Subject: {{site_name}} -New Signup Alert {{email2}}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{site_name}} - Welcome to {{site_name}} </title>
<style type="text/css">
body {margin: 0; padding: 0; min-width: 100%!important;}
img {height: auto;}
.content {width: 100%; max-width: 600px;}
.header {padding: 20px 20px 20px 30px;}
.innerpadding {padding: 10px 10px 10px 10px;}
.borderbottom {border-bottom: 1px solid #f2eeed;}
.subhead {font-size: 12px; color: #ffffff; font-family: sans-serif; letter-spacing: 3px;}
.h1, .bodycopy {color: #153643; font-family: sans-serif;}
.h2 {color: #e6eeed; font-family: sans-serif;}
.h1 {font-size: 33px; line-height: 38px; font-weight: bold;}
.h2 {padding: 0 0 15px 0; font-size: 24px; line-height: 28px; font-weight: bold;}
.bodycopy {font-size: 14px; line-height: 20px;}
.button {text-align: center; font-size: 16px; font-family: sans-serif; font-weight: bold; padding: 0 20px 0 20px;}
.button a {color: #ffffff; text-decoration: none;}
.footer {padding: 20px 30px 15px 30px;}
.footercopy {font-family: sans-serif; font-size: 14px; color: #ffffff;}
.footercopy a {color: #ffffff; text-decoration: underline;}
</style>
</head>
<body yahoo bgcolor="#f6f8f1">
<table width="100%" bgcolor="#f6f8f1" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<!--[if (gte mso 9)|(IE)]>
<table width="600" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table bgcolor="#ffffff" class="content" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td bgcolor="#19b9b3" class="header">
<!--[if (gte mso 9)|(IE)]>
<table width="425" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%; max-width: 425px;">
<tr>
<td height="50">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h1" style="padding: 5px 0 0 0;">
{{site_name}}
</td>
</tr>
<tr>
<td class="subhead" style="padding: 0 0 0 3px;">
{{site_trade_name}}
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h3">
<b>KleenApp Alert</b>,
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<!--[if (gte mso 9)|(IE)]>
<table width="100%" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%;">
<tr>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><b>Firstname:</b> {{firstname}} </td>
</tr>
<tr>
<td><b>Lastname:</b> {{lastname}} </td>
</tr>
<tr>
<td><b>Email:</b> {{email2}} </td>
</tr>
<tr>
<td><b>Date:</b> {{added}} </td>
</tr>
<tr>
<td><b>Location:</b> {{loc}} </td>
</tr>
<tr>
<td><b>Phone:</b> {{phone}} </td>
</tr>
<tr>
<td class="bodycopy">
Support @ https://wwwadmin.kleenapp.co/site .
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
{{site_name}} Team
<br>
{{server_name}}
</td>
</tr>
<tr>
<td class="footer" bgcolor="#493D26">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" class="footercopy">
&reg; {{site_name}} 2018<br/>
This is a support email from {{site_name}}.
</td>
</tr>
<tr>
<td align="center" style="padding: 20px 0 0 0;">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{facebook}}">
<img src="https://{{server_name}}/assets/images/brands/facebook.png" width="37" height="37" alt="Facebook" border="0" />
</a>
</td>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{twitter}}">
<img src="https://{{server_name}}/assets/images/brands/twitter.png" width="37" height="37" alt="Twitter" border="0" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</table>
<!--analytics-->
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</body>
</html>
+189
View File
@@ -0,0 +1,189 @@
Subject: {{site_name}} - Test Email
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{site_name}} - Log in Confirmation</title>
<style type="text/css">
body {margin: 0; padding: 0; min-width: 100%!important;}
img {height: auto;}
.content {width: 100%; max-width: 600px;}
.header {padding: 20px 20px 20px 30px;}
.innerpadding {padding: 10px 10px 10px 10px;}
.borderbottom {border-bottom: 1px solid #f2eeed;}
.subhead {font-size: 12px; color: #ffffff; font-family: sans-serif; letter-spacing: 3px;}
.h1, .bodycopy {color: #153643; font-family: sans-serif;}
.h2 {color: #e6eeed; font-family: sans-serif;}
.h1 {font-size: 33px; line-height: 38px; font-weight: bold;}
.h2 {padding: 0 0 15px 0; font-size: 24px; line-height: 28px; font-weight: bold;}
.bodycopy {font-size: 14px; line-height: 20px;}
.button {text-align: center; font-size: 16px; font-family: sans-serif; font-weight: bold; padding: 0 20px 0 20px;}
.button a {color: #ffffff; text-decoration: none;}
.footer {padding: 20px 30px 15px 30px;}
.footercopy {font-family: sans-serif; font-size: 14px; color: #ffffff;}
.footercopy a {color: #ffffff; text-decoration: underline;}
@media only screen and (max-width: 550px), screen and (max-device-width: 550px) {
body[yahoo] .hide {display: none!important;}
body[yahoo] .buttonwrapper {background-color: transparent!important;}
body[yahoo] .button {padding: 0px!important;}
body[yahoo] .button a {background-color: #e05443; padding: 15px 15px 13px!important;}
body[yahoo] .unsubscribe {display: block; margin-top: 20px; padding: 10px 50px; background: #2f3942; border-radius: 5px; text-decoration: none!important; font-weight: bold;}
}
/*@media only screen and (min-device-width: 601px) {
.content {width: 600px !important;}
.col425 {width: 425px!important;}
.col380 {width: 380px!important;}
}*/
</style>
</head>
<body yahoo bgcolor="#f6f8f1">
<table width="100%" bgcolor="#f6f8f1" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<!--[if (gte mso 9)|(IE)]>
<table width="600" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table bgcolor="#ffffff" class="content" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td bgcolor="#19b9b3" class="header">
<!--[if (gte mso 9)|(IE)]>
<table width="425" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%; max-width: 425px;">
<tr>
<td height="50">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h1" style="padding: 5px 0 0 0;">
{{site_name}}
</td>
</tr>
<tr>
<td class="subhead" style="padding: 0 0 0 3px;">
{{site_trade_name}}
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h3">
Dear <b>{{firstname}}</b>,
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<!--[if (gte mso 9)|(IE)]>
<table width="100%" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%;">
<tr>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="bodycopy">
Please be informed that you logged on to {{site_name}} account at {{last_login2}} from {{loc}}.
</td>
</tr>
<tr>
<td class="bodycopy">
If you did not log on to your account at the time detailed above, please contact us immediately.
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
For all support, contact us at <a href="{{contactus}}">{{contactus}}</a>
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
{{site_name}} Team
<br>
{{server_name}}
</td>
</tr>
<tr>
<td class="footer" bgcolor="#44525f">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" class="footercopy">
&reg; {{site_name}} 2017<br/>
You received this email because you subscribe to {{site_name}}. If you get this email in error, please <a href="{{contactus}}" class="unsubscribe"><font color="#ffffff">contact</font></a> us.
</td>
</tr>
<tr>
<td align="center" style="padding: 20px 0 0 0;">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{facebook}}">
<img src="https://{{server_name}}/assets/images/brands/facebook.png" width="37" height="37" alt="Facebook" border="0" />
</a>
</td>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{twitter}}">
<img src="https://{{server_name}}/assets/images/brands/twitter.png" width="37" height="37" alt="Twitter" border="0" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</table>
<!--analytics-->
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</body>
</html>
@@ -0,0 +1,185 @@
Subject: {{subject}}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{subject}}</title>
<style type="text/css">
body {margin: 0; padding: 0; min-width: 100%!important;}
img {height: auto;}
.content {width: 100%; max-width: 600px;}
.header {padding: 20px 20px 20px 30px;}
.innerpadding {padding: 10px 10px 10px 10px;}
.borderbottom {border-bottom: 1px solid #f2eeed;}
.subhead {font-size: 12px; color: #ffffff; font-family: sans-serif; letter-spacing: 3px;}
.h1, .bodycopy {color: #153643; font-family: sans-serif;}
.h2 {color: #e6eeed; font-family: sans-serif;}
.h1 {font-size: 33px; line-height: 38px; font-weight: bold;}
.h2 {padding: 0 0 15px 0; font-size: 24px; line-height: 28px; font-weight: bold;}
.bodycopy {font-size: 14px; line-height: 20px;}
.button {text-align: center; font-size: 16px; font-family: sans-serif; font-weight: bold; padding: 0 20px 0 20px;}
.button a {color: #ffffff; text-decoration: none;}
.footer {padding: 20px 30px 15px 30px;}
.footercopy {font-family: sans-serif; font-size: 14px; color: #ffffff;}
.footercopy a {color: #ffffff; text-decoration: underline;}
</style>
</head>
<body yahoo bgcolor="#f6f8f1">
<table width="100%" bgcolor="#f6f8f1" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<!--[if (gte mso 9)|(IE)]>
<table width="600" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table bgcolor="#ffffff" class="content" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td bgcolor="#19b9b3" class="header">
<!--[if (gte mso 9)|(IE)]>
<table width="425" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%; max-width: 425px;">
<tr>
<td height="50">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h1" style="padding: 5px 0 0 0;">
{{site_name}}
</td>
</tr>
<tr>
<td class="subhead" style="padding: 0 0 0 3px;">
{{site_trade_name}}
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h3">
Dear {{firstname}},
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<!--[if (gte mso 9)|(IE)]>
<table width="100%" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%;">
<tr>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="bodycopy">
Your dryclean pickup with the details as shown below is now confirmed.
</td>
</tr>
<tr>
<td>
<table class="col425">
<tr><td><b>Date Time</b></td><td>{{long_date}}</td></tr>
<tr><td><b>Destination</b></td><td>{{agent_name}}<br>{{to_street}},{{to_city}},{{to_state}} {{to_zipcode}}</td></tr>
<tr><td><b>Origin</b></td><td>{{from_street}},{{from_city}},{{from_state}} {{from_zipcode}}</td></tr>
<tr><td><b>Request By</b></td><td>{{firstname}} {{lastname}}</td></tr>
<tr><td><b>Service List </b></td><td>
<table border="0" width='100%' id="table1" style="font-family: Trebuchet MS; font-size: 10pt ">
<tr><th></th><th>Item</th><th>Quantity</th><th>Price</th></tr>
{{\inv_items}}
{{...}}
{{pin}}
{{/...}}
{{/inv_items}}
</table>
</td></tr>
<tr><td><b>Payment </b></td><td>${{amount}} Confirmation No: {{confirmation}}</td></tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
<tr>
<td class="innerpadding bodycopy">
{{site_name}} Team
<br>
{{server_name}}
</td>
</tr>
<tr>
<td class="footer" bgcolor="#493D26">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" class="footercopy">
&reg; {{site_name}} 2018<br/>
This is a support email from {{site_name}}.
</td>
</tr>
<tr>
<td align="center" style="padding: 20px 0 0 0;">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{facebook}}">
<img src="https://{{server_name}}/assets/images/brands/facebook.png" width="37" height="37" alt="Facebook" border="0" />
</a>
</td>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{twitter}}">
<img src="https://{{server_name}}/assets/images/brands/twitter.png" width="37" height="37" alt="Twitter" border="0" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</table>
<!--analytics-->
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</body>
</html>
@@ -0,0 +1,191 @@
Subject: {{subject}}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{site_name}} - Transport Request</title>
<style type="text/css">
body {margin: 0; padding: 0; min-width: 100%!important;}
img {height: auto;}
.content {width: 100%; max-width: 600px;}
.header {padding: 20px 20px 20px 30px;}
.innerpadding {padding: 10px 10px 10px 10px;}
.borderbottom {border-bottom: 1px solid #f2eeed;}
.subhead {font-size: 12px; color: #ffffff; font-family: sans-serif; letter-spacing: 3px;}
.h1, .bodycopy {color: #153643; font-family: sans-serif;}
.h2 {color: #e6eeed; font-family: sans-serif;}
.h1 {font-size: 33px; line-height: 38px; font-weight: bold;}
.h2 {padding: 0 0 15px 0; font-size: 24px; line-height: 28px; font-weight: bold;}
.bodycopy {font-size: 14px; line-height: 20px;}
.button {text-align: center; font-size: 16px; font-family: sans-serif; font-weight: bold; padding: 0 20px 0 20px;}
.button a {color: #ffffff; text-decoration: none;}
.footer {padding: 20px 30px 15px 30px;}
.footercopy {font-family: sans-serif; font-size: 14px; color: #ffffff;}
.footercopy a {color: #ffffff; text-decoration: underline;}
</style>
</head>
<body yahoo bgcolor="#f6f8f1">
<table width="100%" bgcolor="#f6f8f1" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<!--[if (gte mso 9)|(IE)]>
<table width="600" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table bgcolor="#ffffff" class="content" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td bgcolor="#19b9b3" class="header">
<!--[if (gte mso 9)|(IE)]>
<table width="425" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%; max-width: 425px;">
<tr>
<td height="50">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h1" style="padding: 5px 0 0 0;">
{{site_name}}
</td>
</tr>
<tr>
<td class="subhead" style="padding: 0 0 0 3px;">
{{site_trade_name}}
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h3">
Dear {{firstname}},
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<!--[if (gte mso 9)|(IE)]>
<table width="100%" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%;">
<tr>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="bodycopy">
Wre are unable to confirm your service request with the details as shows below.
</td>
</tr>
<tr>
<td>
<table class="col425">
<tr><td><b>Date Time</b></td><td>{{long_date}}</td></tr>
<tr><td><b>Destination</b></td><td>{{agent_name}}<br>{{to_street}},{{to_city}},{{to_state}} {{to_zipcode}}</td></tr>
<tr><td><b>Origin</b></td><td>{{from_street}},{{from_city}},{{from_state}} {{from_zipcode}}</td></tr>
<tr><td><b>Request By</b></td><td>{{req_firstname}} {{req_lastname}}</td></tr>
<tr><td><b>Service List </b></td><td>
<table border="0" width='100%' id="table1" style="font-family: Trebuchet MS; font-size: 10pt ">
<tr><th></th><th>Item</th><th>Quantity</th><th>Price</th></tr>
{{\inv_items}}
{{...}}
{{pin}}
{{/...}}
{{/inv_items}}
</table>
</td></tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
Please check the payment information and try again
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
{{site_name}} Team
<br>
{{server_name}}
</td>
</tr>
<tr>
<td class="footer" bgcolor="#493D26">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" class="footercopy">
&reg; {{site_name}} 2018<br/>
This is a support email from {{site_name}}.
</td>
</tr>
<tr>
<td align="center" style="padding: 20px 0 0 0;">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{facebook}}">
<img src="https://{{server_name}}/assets/images/brands/facebook.png" width="37" height="37" alt="Facebook" border="0" />
</a>
</td>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{twitter}}">
<img src="https://{{server_name}}/assets/images/brands/twitter.png" width="37" height="37" alt="Twitter" border="0" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</table>
<!--analytics-->
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</body>
</html>
@@ -0,0 +1,192 @@
Subject: {{subject}}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{site_name}} - {{subject}}</title>
<style type="text/css">
body {margin: 0; padding: 0; min-width: 100%!important;}
img {height: auto;}
.content {width: 100%; max-width: 600px;}
.header {padding: 20px 20px 20px 30px;}
.innerpadding {padding: 10px 10px 10px 10px;}
.borderbottom {border-bottom: 1px solid #f2eeed;}
.subhead {font-size: 12px; color: #ffffff; font-family: sans-serif; letter-spacing: 3px;}
.h1, .bodycopy {color: #153643; font-family: sans-serif;}
.h2 {color: #e6eeed; font-family: sans-serif;}
.h1 {font-size: 33px; line-height: 38px; font-weight: bold;}
.h2 {padding: 0 0 15px 0; font-size: 24px; line-height: 28px; font-weight: bold;}
.bodycopy {font-size: 14px; line-height: 20px;}
.button {text-align: center; font-size: 16px; font-family: sans-serif; font-weight: bold; padding: 0 20px 0 20px;}
.button a {color: #ffffff; text-decoration: none;}
.footer {padding: 20px 30px 15px 30px;}
.footercopy {font-family: sans-serif; font-size: 14px; color: #ffffff;}
.footercopy a {color: #ffffff; text-decoration: underline;}
@media only screen and (max-width: 550px), screen and (max-device-width: 550px) {
body[yahoo] .hide {display: none!important;}
body[yahoo] .buttonwrapper {background-color: transparent!important;}
body[yahoo] .button {padding: 0px!important;}
body[yahoo] .button a {background-color: #e05443; padding: 15px 15px 13px!important;}
body[yahoo] .unsubscribe {display: block; margin-top: 20px; padding: 10px 50px; background: #2f3942; border-radius: 5px; text-decoration: none!important; font-weight: bold;}
}
/*@media only screen and (min-device-width: 601px) {
.content {width: 600px !important;}
.col425 {width: 425px!important;}
.col380 {width: 380px!important;}
}*/
</style>
</head>
<body yahoo bgcolor="#f6f8f1">
<table width="100%" bgcolor="#f6f8f1" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<!--[if (gte mso 9)|(IE)]>
<table width="600" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table bgcolor="#ffffff" class="content" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td bgcolor="#19b9b3" class="header">
<!--[if (gte mso 9)|(IE)]>
<table width="425" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%; max-width: 425px;">
<tr>
<td height="50">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h1" style="padding: 5px 0 0 0;">
{{site_name}}
</td>
</tr>
<tr>
<td class="subhead" style="padding: 0 0 0 3px;">
{{site_trade_name}}
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h3">
Daer {{firstname}},
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<!--[if (gte mso 9)|(IE)]>
<table width="100%" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%;">
<tr>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="bodycopy">
You have received a new pickup request with details below.
</td>
</tr>
<tr>
<td>
<table class="col425">
<tr><td><b>Date Time</b></td><td>{{long_date}}</td></tr>
<tr><td><b>Destination</b></td><td><b>{{agent_name}}<br></b>{{to_street}},{{to_city}},{{to_state}} {{to_zipcode}}</td></tr>
<tr><td><b>Origin</b></td><td>{{from_street}},{{from_city}},{{from_state}} {{from_zipcode}}</td></tr>
<tr><td><b>Request </b></td><td>Laundry Pickup, {{quantity}} Bags </td></tr>
<tr><td><b>Customer Name</b></td><td>{{cus_firstname}} {{cus_lastname}} {{cus_phone}}</td></tr>
</table>
</td>
</tr>
</table>
Use the link {{server_link}}{{confirm_link}}
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
Access your mobile account or <a href="{{https://providers.kleenapp.co/}}">https://https://providers.kleenapp.co/</a> to manage this assignment
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
{{site_name}} Team
<br>
{{server_name}}
</td>
</tr>
<tr>
<td class="footer" bgcolor="#C85A17">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" class="footercopy">
&reg; {{site_name}} 2018<br/>
This is a support alert from {{site_name}}.
</td>
</tr>
<tr>
<td align="center" style="padding: 20px 0 0 0;">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{facebook}}">
<img src="https://{{server_name}}/assets/images/brands/facebook.png" width="37" height="37" alt="Facebook" border="0" />
</a>
</td>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{twitter}}">
<img src="https://{{server_name}}/assets/images/brands/twitter.png" width="37" height="37" alt="Twitter" border="0" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</table>
<!--analytics-->
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</body>
</html>
@@ -0,0 +1,192 @@
Subject: {{subject}}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{subject}}</title>
<style type="text/css">
body {margin: 0; padding: 0; min-width: 100%!important;}
img {height: auto;}
.content {width: 100%; max-width: 600px;}
.header {padding: 10px 10px 10px 10px;}
.innerpadding {padding: 10px 10px 10px 10px;}
.borderbottom {border-bottom: 1px solid #f2eeed;}
.subhead {font-size: 12px; color: #ffffff; font-family: sans-serif; letter-spacing: 3px;}
.h1, .bodycopy {color: #153643; font-family: sans-serif;}
.h2 {color: #e6eeed; font-family: sans-serif;}
.h1 {font-size: 33px; line-height: 38px; font-weight: bold;}
.h2 {padding: 0 0 15px 0; font-size: 24px; line-height: 28px; font-weight: bold;}
.bodycopy {font-size: 14px; line-height: 20px;}
.button {text-align: center; font-size: 16px; font-family: sans-serif; font-weight: bold; padding: 0 20px 0 20px;}
.button a {color: #ffffff; text-decoration: none;}
.footer {padding: 20px 30px 15px 30px;}
.footercopy {font-family: sans-serif; font-size: 14px; color: #ffffff;}
.footercopy a {color: #ffffff; text-decoration: underline;}
</style>
</head>
<body yahoo bgcolor="#f6f8f1">
<table width="100%" bgcolor="#f6f8f1" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<!--[if (gte mso 9)|(IE)]>
<table width="600" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table bgcolor="#ffffff" class="content" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td bgcolor="#19b9b3" class="header">
<!--[if (gte mso 9)|(IE)]>
<table width="425" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%; max-width: 425px;">
<tr>
<td height="50">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h1" style="padding: 5px 0 0 0;">
{{site_name}}
</td>
</tr>
<tr>
<td class="subhead" style="padding: 0 0 0 3px;">
{{site_trade_name}}
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h3">
Dear {{firstname}},
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<!--[if (gte mso 9)|(IE)]>
<table width="100%" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%;">
<tr>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="bodycopy">
Your service pickup with the details as shown below is now confirmed.
</td>
</tr>
<tr>
<td>
<table class="col425">
<tr><td><b>Pickup Date/Time</b></td><td>{{long_date}}</td></tr>
<tr><td><b>Service Location</b></td><td>{{agent_name}}<br>{{to_street}},{{to_city}},{{to_state}} {{to_zipcode}}</td></tr>
<tr><td><b>Customer Pickup Address</b></td><td>{{from_street}},{{from_city}},{{from_state}} {{from_zipcode}}</td></tr>
<tr><td><b>Service Requested By</b></td><td>{{firstname}} {{lastname}}</td></tr>
<tr><td><b>Service List </b></td><td>
<table border="0" width='100%' id="table1" style="font-family: Trebuchet MS; font-size: 10pt ">
<tr><th></th><th>Item</th><th>Quantity</th><th>Price</th></tr>
{{\inv_items}}
{{...}}
{{pin}}
{{/...}}
{{/inv_items}}
</table>
</td></tr>
</table>
</td></tr>
<tr><td><b>Payment </b></td><td>${{amount}} Confirmation No: {{confirmation}}</td></tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
.
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
{{site_name}} Team
<br>
{{server_name}}
</td>
</tr>
<tr>
<td class="footer" bgcolor="#493D26">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" class="footercopy">
&reg; {{site_name}} 2018<br/>
This is a support email from {{site_name}}.
</td>
</tr>
<tr>
<td align="center" style="padding: 20px 0 0 0;">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{facebook}}">
<img src="https://{{server_name}}/assets/images/brands/facebook.png" width="37" height="37" alt="Facebook" border="0" />
</a>
</td>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{twitter}}">
<img src="https://{{server_name}}/assets/images/brands/twitter.png" width="37" height="37" alt="Twitter" border="0" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</table>
<!--analytics-->
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</body>
</html>
@@ -0,0 +1,179 @@
Subject: {{subject}}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{site_name}} - Transport Request</title>
<style type="text/css">
body {margin: 0; padding: 0; min-width: 100%!important;}
img {height: auto;}
.content {width: 100%; max-width: 600px;}
.header {padding: 10px 10px 10px 10px;}
.innerpadding {padding: 10px 10px 10px 10px;}
.borderbottom {border-bottom: 1px solid #f2eeed;}
.subhead {font-size: 12px; color: #ffffff; font-family: sans-serif; letter-spacing: 3px;}
.h1, .bodycopy {color: #153643; font-family: sans-serif;}
.h2 {color: #e6eeed; font-family: sans-serif;}
.h1 {font-size: 33px; line-height: 38px; font-weight: bold;}
.h2 {padding: 0 0 15px 0; font-size: 24px; line-height: 28px; font-weight: bold;}
.bodycopy {font-size: 14px; line-height: 20px;}
.button {text-align: center; font-size: 16px; font-family: sans-serif; font-weight: bold; padding: 0 20px 0 20px;}
.button a {color: #ffffff; text-decoration: none;}
.footer {padding: 20px 30px 15px 30px;}
.footercopy {font-family: sans-serif; font-size: 14px; color: #ffffff;}
.footercopy a {color: #ffffff; text-decoration: underline;}
</style>
</head>
<body yahoo bgcolor="#f6f8f1">
<table width="100%" bgcolor="#f6f8f1" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<!--[if (gte mso 9)|(IE)]>
<table width="600" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table bgcolor="#ffffff" class="content" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td bgcolor="#19b9b3" class="header">
<!--[if (gte mso 9)|(IE)]>
<table width="425" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%; max-width: 425px;">
<tr>
<td height="50">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h1" style="padding: 5px 0 0 0;">
{{site_name}}
</td>
</tr>
<tr>
<td class="subhead" style="padding: 0 0 0 3px;">
{{site_trade_name}}
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h3">
Dear {{firstname}},
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<!--[if (gte mso 9)|(IE)]>
<table width="100%" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%;">
<tr>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="bodycopy">
Wre are unable to confirm your laundry pickup with the details as shown below.
</td>
</tr>
<tr>
<td>
<table class="col425">
<tr><td><b>Date Time</b></td><td>{{long_date}}</td></tr>
<tr><td><b>Destination</b></td><td>{{agent_name}}<br>{{to_street}},{{to_city}},{{to_state}} {{to_zipcode}}</td></tr>
<tr><td><b>Origin</b></td><td>{{from_street}},{{from_city}},{{from_state}} {{from_zipcode}}</td></tr>
<tr><td><b>Request By</b></td><td>{{req_firstname}} {{req_lastname}}</td></tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
Please checnk ythe payment information and try again
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
{{site_name}} Team
<br>
{{server_name}}
</td>
</tr>
<tr>
<td class="footer" bgcolor="#493D26">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" class="footercopy">
&reg; {{site_name}} 2018<br/>
This is a support email from {{site_name}}.
</td>
</tr>
<tr>
<td align="center" style="padding: 20px 0 0 0;">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{facebook}}">
<img src="https://{{server_name}}/assets/images/brands/facebook.png" width="37" height="37" alt="Facebook" border="0" />
</a>
</td>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{twitter}}">
<img src="https://{{server_name}}/assets/images/brands/twitter.png" width="37" height="37" alt="Twitter" border="0" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</table>
<!--analytics-->
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</body>
</html>
@@ -0,0 +1,187 @@
Subject: {{site_name}} - {{subject}}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{site_name}} - {{subject}}</title>
<style type="text/css">
body {margin: 0; padding: 0; min-width: 100%!important;}
img {height: auto;}
.content {width: 100%; max-width: 600px;}
.header {padding: 20px 20px 20px 30px;}
.innerpadding {padding: 10px 10px 10px 10px;}
.borderbottom {border-bottom: 1px solid #f2eeed;}
.subhead {font-size: 12px; color: #ffffff; font-family: sans-serif; letter-spacing: 3px;}
.h1, .bodycopy {color: #153643; font-family: sans-serif;}
.h2 {color: #e6eeed; font-family: sans-serif;}
.h1 {font-size: 33px; line-height: 38px; font-weight: bold;}
.h2 {padding: 0 0 15px 0; font-size: 24px; line-height: 28px; font-weight: bold;}
.bodycopy {font-size: 14px; line-height: 20px;}
.button {text-align: center; font-size: 16px; font-family: sans-serif; font-weight: bold; padding: 0 20px 0 20px;}
.button a {color: #ffffff; text-decoration: none;}
.footer {padding: 20px 30px 15px 30px;}
.footercopy {font-family: sans-serif; font-size: 14px; color: #ffffff;}
.footercopy a {color: #ffffff; text-decoration: underline;}
@media only screen and (max-width: 550px), screen and (max-device-width: 550px) {
body[yahoo] .hide {display: none!important;}
body[yahoo] .buttonwrapper {background-color: transparent!important;}
body[yahoo] .button {padding: 0px!important;}
body[yahoo] .button a {background-color: #e05443; padding: 15px 15px 13px!important;}
body[yahoo] .unsubscribe {display: block; margin-top: 20px; padding: 10px 50px; background: #2f3942; border-radius: 5px; text-decoration: none!important; font-weight: bold;}
}
/*@media only screen and (min-device-width: 601px) {
.content {width: 600px !important;}
.col425 {width: 425px!important;}
.col380 {width: 380px!important;}
}*/
</style>
</head>
<body yahoo bgcolor="#f6f8f1">
<table width="100%" bgcolor="#f6f8f1" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<!--[if (gte mso 9)|(IE)]>
<table width="600" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table bgcolor="#ffffff" class="content" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td bgcolor="#19b9b3" class="header">
<!--[if (gte mso 9)|(IE)]>
<table width="425" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%; max-width: 425px;">
<tr>
<td height="50">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h1" style="padding: 5px 0 0 0;">
{{site_name}}
</td>
</tr>
<tr>
<td class="subhead" style="padding: 0 0 0 3px;">
{{site_trade_name}}
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
Dear <b>{{firstname}}</b>,
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<!--[if (gte mso 9)|(IE)]>
<table width="100%" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%;">
<tr>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="bodycopy">
You have added a {{description}} card ending in {{digits}} to your account successfully.</td>
</tr>
<tr>
<td class="bodycopy">
<br>
If you are not aware of the activity above, please contact us immediately. </td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
For all support, contact us at <a href="{{contactus}}">{{contactus}}</a>
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
{{site_name}} Team
<br>
{{server_name}}
</td>
</tr>
<tr>
<td class="footer" bgcolor="#493D26">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" class="footercopy">
&reg; {{site_name}} 2018<br/>
This is a support email from {{site_name}}.
</td>
</tr>
<tr>
<td align="center" style="padding: 20px 0 0 0;">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{facebook}}">
<img src="https://{{server_name}}/assets/images/brands/facebook.png" width="37" height="37" alt="Facebook" border="0" />
</a>
</td>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{twitter}}">
<img src="https://{{server_name}}/assets/images/brands/twitter.png" width="37" height="37" alt="Twitter" border="0" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</table>
<!--analytics-->
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</body>
</html>
@@ -0,0 +1,179 @@
Subject: {{subject}}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{site_name}} - {{subject}}</title>
<style type="text/css">
body {margin: 0; padding: 0; min-width: 100%!important;}
img {height: auto;}
.content {width: 100%; max-width: 600px;}
.header {padding: 20px 20px 20px 30px;}
.innerpadding {padding: 10px 10px 10px 10px;}
.borderbottom {border-bottom: 1px solid #f2eeed;}
.subhead {font-size: 12px; color: #ffffff; font-family: sans-serif; letter-spacing: 3px;}
.h1, .bodycopy {color: #153643; font-family: sans-serif;}
.h2 {color: #e6eeed; font-family: sans-serif;}
.h1 {font-size: 33px; line-height: 38px; font-weight: bold;}
.h2 {padding: 0 0 15px 0; font-size: 24px; line-height: 28px; font-weight: bold;}
.bodycopy {font-size: 14px; line-height: 20px;}
.button {text-align: center; font-size: 16px; font-family: sans-serif; font-weight: bold; padding: 0 20px 0 20px;}
.button a {color: #ffffff; text-decoration: none;}
.footer {padding: 20px 30px 15px 30px;}
.footercopy {font-family: sans-serif; font-size: 14px; color: #ffffff;}
.footercopy a {color: #ffffff; text-decoration: underline;}
</style>
</head>
<body yahoo bgcolor="#f6f8f1">
<table width="100%" bgcolor="#f6f8f1" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<!--[if (gte mso 9)|(IE)]>
<table width="600" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table bgcolor="#ffffff" class="content" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td bgcolor="#19b9b3" class="header">
<!--[if (gte mso 9)|(IE)]>
<table width="425" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%; max-width: 425px;">
<tr>
<td height="50">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h1" style="padding: 5px 0 0 0;">
{{site_name}}
</td>
</tr>
<tr>
<td class="subhead" style="padding: 0 0 0 3px;">
{{site_trade_name}}
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h3">
Daer {{firstname}},
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<!--[if (gte mso 9)|(IE)]>
<table width="100%" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%;">
<tr>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="bodycopy">
You have received a new pickup request with details shown below.
</td>
</tr>
<tr>
<td>
<table class="col425">
<tr><td><b>Date Time</b></td><td>{{long_date}}</td></tr>
<tr><td><b>Destination</b></td><td><b>{{ vars2form(x2, form);}}<br></b>{{street}},{{to_city}},{{to_state}} {{to_zipcode}}</td></tr>
<tr><td><b>Origin</b></td><td>{{from_street}},{{from_city}},{{from_state}} {{from_zipcode}}</td></tr>
<tr><td><b>Request </b></td><td>Laundry Pickup , {{quantity}} Bags </td></tr>
<tr><td><b>Customer Name</b></td><td>{{cust_firstname}} {{cust_lastname}} {{cust_phone}}</td></tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
Access your mobile account or <a href="{{https://providers.kleenapp.co/}}">https://https://providers.kleenapp.co/</a> to manage this assignment
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
{{site_name}} Team
<br>
{{server_name}}
</td>
</tr>
<tr>
<td class="footer" bgcolor="#C85A17">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" class="footercopy">
&reg; {{site_name}} 2018<br/>
This is a support alert from {{site_name}}.
</td>
</tr>
<tr>
<td align="center" style="padding: 20px 0 0 0;">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{facebook}}">
<img src="https://{{server_name}}/assets/images/brands/facebook.png" width="37" height="37" alt="Facebook" border="0" />
</a>
</td>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{twitter}}">
<img src="https://{{server_name}}/assets/images/brands/twitter.png" width="37" height="37" alt="Twitter" border="0" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</table>
<!--analytics-->
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</body>
</html>
@@ -0,0 +1,193 @@
Subject: Translation Request Received
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{site_name}} - Translation Request</title>
<style type="text/css">
body {margin: 0; padding: 0; min-width: 100%!important;}
img {height: auto;}
.content {width: 100%; max-width: 600px;}
.header {padding: 20px 20px 20px 30px;}
.innerpadding {padding: 10px 10px 10px 10px;}
.borderbottom {border-bottom: 1px solid #f2eeed;}
.subhead {font-size: 12px; color: #ffffff; font-family: sans-serif; letter-spacing: 3px;}
.h1, .bodycopy {color: #153643; font-family: sans-serif;}
.h2 {color: #e6eeed; font-family: sans-serif;}
.h1 {font-size: 33px; line-height: 38px; font-weight: bold;}
.h2 {padding: 0 0 15px 0; font-size: 24px; line-height: 28px; font-weight: bold;}
.bodycopy {font-size: 14px; line-height: 20px;}
.button {text-align: center; font-size: 16px; font-family: sans-serif; font-weight: bold; padding: 0 20px 0 20px;}
.button a {color: #ffffff; text-decoration: none;}
.footer {padding: 20px 30px 15px 30px;}
.footercopy {font-family: sans-serif; font-size: 14px; color: #ffffff;}
.footercopy a {color: #ffffff; text-decoration: underline;}
@media only screen and (max-width: 550px), screen and (max-device-width: 550px) {
body[yahoo] .hide {display: none!important;}
body[yahoo] .buttonwrapper {background-color: transparent!important;}
body[yahoo] .button {padding: 0px!important;}
body[yahoo] .button a {background-color: #e05443; padding: 15px 15px 13px!important;}
body[yahoo] .unsubscribe {display: block; margin-top: 20px; padding: 10px 50px; background: #2f3942; border-radius: 5px; text-decoration: none!important; font-weight: bold;}
}
/*@media only screen and (min-device-width: 601px) {
.content {width: 600px !important;}
.col425 {width: 425px!important;}
.col380 {width: 380px!important;}
}*/
</style>
</head>
<body yahoo bgcolor="#f6f8f1">
<table width="100%" bgcolor="#f6f8f1" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<!--[if (gte mso 9)|(IE)]>
<table width="600" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table bgcolor="#ffffff" class="content" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td bgcolor="#19b9b3" class="header">
<!--[if (gte mso 9)|(IE)]>
<table width="425" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%; max-width: 425px;">
<tr>
<td height="50">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h1" style="padding: 5px 0 0 0;">
{{site_name}}
</td>
</tr>
<tr>
<td class="subhead" style="padding: 0 0 0 3px;">
{{site_trade_name}}
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h3">
Dear {{req_firstname}},
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<!--[if (gte mso 9)|(IE)]>
<table width="100%" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%;">
<tr>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="bodycopy">
We have received your translation request with details below.
</td>
</tr>
<tr>
<td>
<table class="col425">
<tr><td><b>Date Time</b></td><td>{{long_date}}</td></tr>
<tr><td><b>Language</b></td><td><b>{{language}}</b></td></tr>
<tr><td><b>Hours Requested</b></td><td>{{hoursneeded}}-Hour(s)</td></tr>
<tr><td><b>Location</b></td><td>{{to_street}},{{to_city}},{{to_state}} {{to_zipcode}}</td></tr>
<tr><td><b>Request By</b></td><td>{{req_firstname}} {{req_lastname}}</td></tr>
<tr><td><b>Patient Name</b></td><td>{{firstname}} {{lastname}} {{patient_number}}</td></tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
You will receive further messages as the status of the request changes.
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
{{site_name}} Team
<br>
{{server_name}}
</td>
</tr>
<tr>
<td class="footer" bgcolor="#493D26">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" class="footercopy">
&reg; {{site_name}} 2018<br/>
This is a support email from {{site_name}}.
</td>
</tr>
<tr>
<td align="center" style="padding: 20px 0 0 0;">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{facebook}}">
<img src="https://{{server_name}}/assets/images/brands/facebook.png" width="37" height="37" alt="Facebook" border="0" />
</a>
</td>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{twitter}}">
<img src="https://{{server_name}}/assets/images/brands/twitter.png" width="37" height="37" alt="Twitter" border="0" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</table>
<!--analytics-->
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</body>
</html>
@@ -0,0 +1,189 @@
Subject: {{site_name}} - Test Email
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{site_name}} - Log in Confirmation</title>
<style type="text/css">
body {margin: 0; padding: 0; min-width: 100%!important;}
img {height: auto;}
.content {width: 100%; max-width: 600px;}
.header {padding: 20px 20px 20px 30px;}
.innerpadding {padding: 10px 10px 10px 10px;}
.borderbottom {border-bottom: 1px solid #f2eeed;}
.subhead {font-size: 12px; color: #ffffff; font-family: sans-serif; letter-spacing: 3px;}
.h1, .bodycopy {color: #153643; font-family: sans-serif;}
.h2 {color: #e6eeed; font-family: sans-serif;}
.h1 {font-size: 33px; line-height: 38px; font-weight: bold;}
.h2 {padding: 0 0 15px 0; font-size: 24px; line-height: 28px; font-weight: bold;}
.bodycopy {font-size: 14px; line-height: 20px;}
.button {text-align: center; font-size: 16px; font-family: sans-serif; font-weight: bold; padding: 0 20px 0 20px;}
.button a {color: #ffffff; text-decoration: none;}
.footer {padding: 20px 30px 15px 30px;}
.footercopy {font-family: sans-serif; font-size: 14px; color: #ffffff;}
.footercopy a {color: #ffffff; text-decoration: underline;}
@media only screen and (max-width: 550px), screen and (max-device-width: 550px) {
body[yahoo] .hide {display: none!important;}
body[yahoo] .buttonwrapper {background-color: transparent!important;}
body[yahoo] .button {padding: 0px!important;}
body[yahoo] .button a {background-color: #e05443; padding: 15px 15px 13px!important;}
body[yahoo] .unsubscribe {display: block; margin-top: 20px; padding: 10px 50px; background: #2f3942; border-radius: 5px; text-decoration: none!important; font-weight: bold;}
}
/*@media only screen and (min-device-width: 601px) {
.content {width: 600px !important;}
.col425 {width: 425px!important;}
.col380 {width: 380px!important;}
}*/
</style>
</head>
<body yahoo bgcolor="#f6f8f1">
<table width="100%" bgcolor="#f6f8f1" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<!--[if (gte mso 9)|(IE)]>
<table width="600" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table bgcolor="#ffffff" class="content" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td bgcolor="#19b9b3" class="header">
<!--[if (gte mso 9)|(IE)]>
<table width="425" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%; max-width: 425px;">
<tr>
<td height="50">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h1" style="padding: 5px 0 0 0;">
{{site_name}}
</td>
</tr>
<tr>
<td class="subhead" style="padding: 0 0 0 3px;">
{{site_trade_name}}
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h3">
Dear <b>{{firstname}}</b>,
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<!--[if (gte mso 9)|(IE)]>
<table width="100%" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%;">
<tr>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="bodycopy">
Please be informed that you logged on to {{site_name}} account at {{last_login2}} from {{loc}}.
</td>
</tr>
<tr>
<td class="bodycopy">
If you did not log on to your account at the time detailed above, please contact us immediately.
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
For all support, contact us at <a href="{{contactus}}">{{contactus}}</a>
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
{{site_name}} Team
<br>
{{server_name}}
</td>
</tr>
<tr>
<td class="footer" bgcolor="#44525f">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" class="footercopy">
&reg; {{site_name}} 2017<br/>
You received this email because you subscribe to {{site_name}}. If you get this email in error, please <a href="{{contactus}}" class="unsubscribe"><font color="#ffffff">contact</font></a> us.
</td>
</tr>
<tr>
<td align="center" style="padding: 20px 0 0 0;">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{facebook}}">
<img src="https://{{server_name}}/assets/images/brands/facebook.png" width="37" height="37" alt="Facebook" border="0" />
</a>
</td>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{twitter}}">
<img src="https://{{server_name}}/assets/images/brands/twitter.png" width="37" height="37" alt="Twitter" border="0" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</table>
<!--analytics-->
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</body>
</html>
@@ -0,0 +1,189 @@
Subject: {{site_name}} - Test Email
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{site_name}} - Log in Confirmation</title>
<style type="text/css">
body {margin: 0; padding: 0; min-width: 100%!important;}
img {height: auto;}
.content {width: 100%; max-width: 600px;}
.header {padding: 20px 20px 20px 30px;}
.innerpadding {padding: 10px 10px 10px 10px;}
.borderbottom {border-bottom: 1px solid #f2eeed;}
.subhead {font-size: 12px; color: #ffffff; font-family: sans-serif; letter-spacing: 3px;}
.h1, .bodycopy {color: #153643; font-family: sans-serif;}
.h2 {color: #e6eeed; font-family: sans-serif;}
.h1 {font-size: 33px; line-height: 38px; font-weight: bold;}
.h2 {padding: 0 0 15px 0; font-size: 24px; line-height: 28px; font-weight: bold;}
.bodycopy {font-size: 14px; line-height: 20px;}
.button {text-align: center; font-size: 16px; font-family: sans-serif; font-weight: bold; padding: 0 20px 0 20px;}
.button a {color: #ffffff; text-decoration: none;}
.footer {padding: 20px 30px 15px 30px;}
.footercopy {font-family: sans-serif; font-size: 14px; color: #ffffff;}
.footercopy a {color: #ffffff; text-decoration: underline;}
@media only screen and (max-width: 550px), screen and (max-device-width: 550px) {
body[yahoo] .hide {display: none!important;}
body[yahoo] .buttonwrapper {background-color: transparent!important;}
body[yahoo] .button {padding: 0px!important;}
body[yahoo] .button a {background-color: #e05443; padding: 15px 15px 13px!important;}
body[yahoo] .unsubscribe {display: block; margin-top: 20px; padding: 10px 50px; background: #2f3942; border-radius: 5px; text-decoration: none!important; font-weight: bold;}
}
/*@media only screen and (min-device-width: 601px) {
.content {width: 600px !important;}
.col425 {width: 425px!important;}
.col380 {width: 380px!important;}
}*/
</style>
</head>
<body yahoo bgcolor="#f6f8f1">
<table width="100%" bgcolor="#f6f8f1" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<!--[if (gte mso 9)|(IE)]>
<table width="600" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table bgcolor="#ffffff" class="content" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td bgcolor="#19b9b3" class="header">
<!--[if (gte mso 9)|(IE)]>
<table width="425" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%; max-width: 425px;">
<tr>
<td height="50">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h1" style="padding: 5px 0 0 0;">
{{site_name}}
</td>
</tr>
<tr>
<td class="subhead" style="padding: 0 0 0 3px;">
{{site_trade_name}}
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h3">
Dear <b>{{firstname}}</b>,
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<!--[if (gte mso 9)|(IE)]>
<table width="100%" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%;">
<tr>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="bodycopy">
Please be informed that you logged on to {{site_name}} account at {{last_login2}} from {{loc}}.
</td>
</tr>
<tr>
<td class="bodycopy">
If you did not log on to your account at the time detailed above, please contact us immediately.
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
For all support, contact us at <a href="{{contactus}}">{{contactus}}</a>
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
{{site_name}} Team
<br>
{{server_name}}
</td>
</tr>
<tr>
<td class="footer" bgcolor="#44525f">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" class="footercopy">
&reg; {{site_name}} 2017<br/>
You received this email because you subscribe to {{site_name}}. If you get this email in error, please <a href="{{contactus}}" class="unsubscribe"><font color="#ffffff">contact</font></a> us.
</td>
</tr>
<tr>
<td align="center" style="padding: 20px 0 0 0;">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{facebook}}">
<img src="https://{{server_name}}/assets/images/brands/facebook.png" width="37" height="37" alt="Facebook" border="0" />
</a>
</td>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{twitter}}">
<img src="https://{{server_name}}/assets/images/brands/twitter.png" width="37" height="37" alt="Twitter" border="0" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</table>
<!--analytics-->
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</body>
</html>
@@ -0,0 +1,189 @@
Subject: {{site_name}} - Test Email
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{site_name}} - Log in Confirmation</title>
<style type="text/css">
body {margin: 0; padding: 0; min-width: 100%!important;}
img {height: auto;}
.content {width: 100%; max-width: 600px;}
.header {padding: 20px 20px 20px 30px;}
.innerpadding {padding: 10px 10px 10px 10px;}
.borderbottom {border-bottom: 1px solid #f2eeed;}
.subhead {font-size: 12px; color: #ffffff; font-family: sans-serif; letter-spacing: 3px;}
.h1, .bodycopy {color: #153643; font-family: sans-serif;}
.h2 {color: #e6eeed; font-family: sans-serif;}
.h1 {font-size: 33px; line-height: 38px; font-weight: bold;}
.h2 {padding: 0 0 15px 0; font-size: 24px; line-height: 28px; font-weight: bold;}
.bodycopy {font-size: 14px; line-height: 20px;}
.button {text-align: center; font-size: 16px; font-family: sans-serif; font-weight: bold; padding: 0 20px 0 20px;}
.button a {color: #ffffff; text-decoration: none;}
.footer {padding: 20px 30px 15px 30px;}
.footercopy {font-family: sans-serif; font-size: 14px; color: #ffffff;}
.footercopy a {color: #ffffff; text-decoration: underline;}
@media only screen and (max-width: 550px), screen and (max-device-width: 550px) {
body[yahoo] .hide {display: none!important;}
body[yahoo] .buttonwrapper {background-color: transparent!important;}
body[yahoo] .button {padding: 0px!important;}
body[yahoo] .button a {background-color: #e05443; padding: 15px 15px 13px!important;}
body[yahoo] .unsubscribe {display: block; margin-top: 20px; padding: 10px 50px; background: #2f3942; border-radius: 5px; text-decoration: none!important; font-weight: bold;}
}
/*@media only screen and (min-device-width: 601px) {
.content {width: 600px !important;}
.col425 {width: 425px!important;}
.col380 {width: 380px!important;}
}*/
</style>
</head>
<body yahoo bgcolor="#f6f8f1">
<table width="100%" bgcolor="#f6f8f1" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<!--[if (gte mso 9)|(IE)]>
<table width="600" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table bgcolor="#ffffff" class="content" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td bgcolor="#19b9b3" class="header">
<!--[if (gte mso 9)|(IE)]>
<table width="425" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%; max-width: 425px;">
<tr>
<td height="50">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h1" style="padding: 5px 0 0 0;">
{{site_name}}
</td>
</tr>
<tr>
<td class="subhead" style="padding: 0 0 0 3px;">
{{site_trade_name}}
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h3">
Dear <b>{{firstname}}</b>,
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<!--[if (gte mso 9)|(IE)]>
<table width="100%" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%;">
<tr>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="bodycopy">
Please be informed that you logged on to {{site_name}} account at {{last_login2}} from {{loc}}.
</td>
</tr>
<tr>
<td class="bodycopy">
If you did not log on to your account at the time detailed above, please contact us immediately.
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
For all support, contact us at <a href="{{contactus}}">{{contactus}}</a>
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
{{site_name}} Team
<br>
{{server_name}}
</td>
</tr>
<tr>
<td class="footer" bgcolor="#44525f">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" class="footercopy">
&reg; {{site_name}} 2017<br/>
You received this email because you subscribe to {{site_name}}. If you get this email in error, please <a href="{{contactus}}" class="unsubscribe"><font color="#ffffff">contact</font></a> us.
</td>
</tr>
<tr>
<td align="center" style="padding: 20px 0 0 0;">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{facebook}}">
<img src="https://{{server_name}}/assets/images/brands/facebook.png" width="37" height="37" alt="Facebook" border="0" />
</a>
</td>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{twitter}}">
<img src="https://{{server_name}}/assets/images/brands/twitter.png" width="37" height="37" alt="Twitter" border="0" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</table>
<!--analytics-->
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</body>
</html>
@@ -0,0 +1,189 @@
Subject: {{site_name}} - Test Email
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{site_name}} - Log in Confirmation</title>
<style type="text/css">
body {margin: 0; padding: 0; min-width: 100%!important;}
img {height: auto;}
.content {width: 100%; max-width: 600px;}
.header {padding: 20px 20px 20px 30px;}
.innerpadding {padding: 10px 10px 10px 10px;}
.borderbottom {border-bottom: 1px solid #f2eeed;}
.subhead {font-size: 12px; color: #ffffff; font-family: sans-serif; letter-spacing: 3px;}
.h1, .bodycopy {color: #153643; font-family: sans-serif;}
.h2 {color: #e6eeed; font-family: sans-serif;}
.h1 {font-size: 33px; line-height: 38px; font-weight: bold;}
.h2 {padding: 0 0 15px 0; font-size: 24px; line-height: 28px; font-weight: bold;}
.bodycopy {font-size: 14px; line-height: 20px;}
.button {text-align: center; font-size: 16px; font-family: sans-serif; font-weight: bold; padding: 0 20px 0 20px;}
.button a {color: #ffffff; text-decoration: none;}
.footer {padding: 20px 30px 15px 30px;}
.footercopy {font-family: sans-serif; font-size: 14px; color: #ffffff;}
.footercopy a {color: #ffffff; text-decoration: underline;}
@media only screen and (max-width: 550px), screen and (max-device-width: 550px) {
body[yahoo] .hide {display: none!important;}
body[yahoo] .buttonwrapper {background-color: transparent!important;}
body[yahoo] .button {padding: 0px!important;}
body[yahoo] .button a {background-color: #e05443; padding: 15px 15px 13px!important;}
body[yahoo] .unsubscribe {display: block; margin-top: 20px; padding: 10px 50px; background: #2f3942; border-radius: 5px; text-decoration: none!important; font-weight: bold;}
}
/*@media only screen and (min-device-width: 601px) {
.content {width: 600px !important;}
.col425 {width: 425px!important;}
.col380 {width: 380px!important;}
}*/
</style>
</head>
<body yahoo bgcolor="#f6f8f1">
<table width="100%" bgcolor="#f6f8f1" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<!--[if (gte mso 9)|(IE)]>
<table width="600" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table bgcolor="#ffffff" class="content" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td bgcolor="#19b9b3" class="header">
<!--[if (gte mso 9)|(IE)]>
<table width="425" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%; max-width: 425px;">
<tr>
<td height="50">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h1" style="padding: 5px 0 0 0;">
{{site_name}}
</td>
</tr>
<tr>
<td class="subhead" style="padding: 0 0 0 3px;">
{{site_trade_name}}
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h3">
Dear <b>{{firstname}}</b>,
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<!--[if (gte mso 9)|(IE)]>
<table width="100%" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%;">
<tr>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="bodycopy">
Please be informed that you logged on to {{site_name}} account at {{last_login2}} from {{loc}}.
</td>
</tr>
<tr>
<td class="bodycopy">
If you did not log on to your account at the time detailed above, please contact us immediately.
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
For all support, contact us at <a href="{{contactus}}">{{contactus}}</a>
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
{{site_name}} Team
<br>
{{server_name}}
</td>
</tr>
<tr>
<td class="footer" bgcolor="#44525f">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" class="footercopy">
&reg; {{site_name}} 2017<br/>
You received this email because you subscribe to {{site_name}}. If you get this email in error, please <a href="{{contactus}}" class="unsubscribe"><font color="#ffffff">contact</font></a> us.
</td>
</tr>
<tr>
<td align="center" style="padding: 20px 0 0 0;">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{facebook}}">
<img src="https://{{server_name}}/assets/images/brands/facebook.png" width="37" height="37" alt="Facebook" border="0" />
</a>
</td>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{twitter}}">
<img src="https://{{server_name}}/assets/images/brands/twitter.png" width="37" height="37" alt="Twitter" border="0" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</table>
<!--analytics-->
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</body>
</html>
@@ -0,0 +1,189 @@
Subject: {{site_name}} - Test Email
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{site_name}} - Log in Confirmation</title>
<style type="text/css">
body {margin: 0; padding: 0; min-width: 100%!important;}
img {height: auto;}
.content {width: 100%; max-width: 600px;}
.header {padding: 20px 20px 20px 30px;}
.innerpadding {padding: 10px 10px 10px 10px;}
.borderbottom {border-bottom: 1px solid #f2eeed;}
.subhead {font-size: 12px; color: #ffffff; font-family: sans-serif; letter-spacing: 3px;}
.h1, .bodycopy {color: #153643; font-family: sans-serif;}
.h2 {color: #e6eeed; font-family: sans-serif;}
.h1 {font-size: 33px; line-height: 38px; font-weight: bold;}
.h2 {padding: 0 0 15px 0; font-size: 24px; line-height: 28px; font-weight: bold;}
.bodycopy {font-size: 14px; line-height: 20px;}
.button {text-align: center; font-size: 16px; font-family: sans-serif; font-weight: bold; padding: 0 20px 0 20px;}
.button a {color: #ffffff; text-decoration: none;}
.footer {padding: 20px 30px 15px 30px;}
.footercopy {font-family: sans-serif; font-size: 14px; color: #ffffff;}
.footercopy a {color: #ffffff; text-decoration: underline;}
@media only screen and (max-width: 550px), screen and (max-device-width: 550px) {
body[yahoo] .hide {display: none!important;}
body[yahoo] .buttonwrapper {background-color: transparent!important;}
body[yahoo] .button {padding: 0px!important;}
body[yahoo] .button a {background-color: #e05443; padding: 15px 15px 13px!important;}
body[yahoo] .unsubscribe {display: block; margin-top: 20px; padding: 10px 50px; background: #2f3942; border-radius: 5px; text-decoration: none!important; font-weight: bold;}
}
/*@media only screen and (min-device-width: 601px) {
.content {width: 600px !important;}
.col425 {width: 425px!important;}
.col380 {width: 380px!important;}
}*/
</style>
</head>
<body yahoo bgcolor="#f6f8f1">
<table width="100%" bgcolor="#f6f8f1" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<!--[if (gte mso 9)|(IE)]>
<table width="600" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table bgcolor="#ffffff" class="content" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td bgcolor="#19b9b3" class="header">
<!--[if (gte mso 9)|(IE)]>
<table width="425" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%; max-width: 425px;">
<tr>
<td height="50">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h1" style="padding: 5px 0 0 0;">
{{site_name}}
</td>
</tr>
<tr>
<td class="subhead" style="padding: 0 0 0 3px;">
{{site_trade_name}}
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h3">
Dear <b>{{firstname}}</b>,
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<!--[if (gte mso 9)|(IE)]>
<table width="100%" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%;">
<tr>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="bodycopy">
Please be informed that you logged on to {{site_name}} account at {{last_login2}} from {{loc}}.
</td>
</tr>
<tr>
<td class="bodycopy">
If you did not log on to your account at the time detailed above, please contact us immediately.
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
For all support, contact us at <a href="{{contactus}}">{{contactus}}</a>
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
{{site_name}} Team
<br>
{{server_name}}
</td>
</tr>
<tr>
<td class="footer" bgcolor="#44525f">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" class="footercopy">
&reg; {{site_name}} 2017<br/>
You received this email because you subscribe to {{site_name}}. If you get this email in error, please <a href="{{contactus}}" class="unsubscribe"><font color="#ffffff">contact</font></a> us.
</td>
</tr>
<tr>
<td align="center" style="padding: 20px 0 0 0;">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{facebook}}">
<img src="https://{{server_name}}/assets/images/brands/facebook.png" width="37" height="37" alt="Facebook" border="0" />
</a>
</td>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{twitter}}">
<img src="https://{{server_name}}/assets/images/brands/twitter.png" width="37" height="37" alt="Twitter" border="0" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</table>
<!--analytics-->
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</body>
</html>
@@ -0,0 +1,192 @@
Subject: Transport Request Received
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{site_name}} - Transport Request</title>
<style type="text/css">
body {margin: 0; padding: 0; min-width: 100%!important;}
img {height: auto;}
.content {width: 100%; max-width: 600px;}
.header {padding: 20px 20px 20px 30px;}
.innerpadding {padding: 10px 10px 10px 10px;}
.borderbottom {border-bottom: 1px solid #f2eeed;}
.subhead {font-size: 12px; color: #ffffff; font-family: sans-serif; letter-spacing: 3px;}
.h1, .bodycopy {color: #153643; font-family: sans-serif;}
.h2 {color: #e6eeed; font-family: sans-serif;}
.h1 {font-size: 33px; line-height: 38px; font-weight: bold;}
.h2 {padding: 0 0 15px 0; font-size: 24px; line-height: 28px; font-weight: bold;}
.bodycopy {font-size: 14px; line-height: 20px;}
.button {text-align: center; font-size: 16px; font-family: sans-serif; font-weight: bold; padding: 0 20px 0 20px;}
.button a {color: #ffffff; text-decoration: none;}
.footer {padding: 20px 30px 15px 30px;}
.footercopy {font-family: sans-serif; font-size: 14px; color: #ffffff;}
.footercopy a {color: #ffffff; text-decoration: underline;}
@media only screen and (max-width: 550px), screen and (max-device-width: 550px) {
body[yahoo] .hide {display: none!important;}
body[yahoo] .buttonwrapper {background-color: transparent!important;}
body[yahoo] .button {padding: 0px!important;}
body[yahoo] .button a {background-color: #e05443; padding: 15px 15px 13px!important;}
body[yahoo] .unsubscribe {display: block; margin-top: 20px; padding: 10px 50px; background: #2f3942; border-radius: 5px; text-decoration: none!important; font-weight: bold;}
}
/*@media only screen and (min-device-width: 601px) {
.content {width: 600px !important;}
.col425 {width: 425px!important;}
.col380 {width: 380px!important;}
}*/
</style>
</head>
<body yahoo bgcolor="#f6f8f1">
<table width="100%" bgcolor="#f6f8f1" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<!--[if (gte mso 9)|(IE)]>
<table width="600" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table bgcolor="#ffffff" class="content" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td bgcolor="#19b9b3" class="header">
<!--[if (gte mso 9)|(IE)]>
<table width="425" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%; max-width: 425px;">
<tr>
<td height="50">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h1" style="padding: 5px 0 0 0;">
{{site_name}}
</td>
</tr>
<tr>
<td class="subhead" style="padding: 0 0 0 3px;">
{{site_trade_name}}
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h3">
Dear {{req_firstname}},
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<!--[if (gte mso 9)|(IE)]>
<table width="100%" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%;">
<tr>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="bodycopy">
We have received your transport request as shows below.
</td>
</tr>
<tr>
<td>
<table class="col425">
<tr><td><b>Date Time</b></td><td>{{long_date}}</td></tr>
<tr><td><b>Destination</b></td><td>{{to_street}},{{to_city}},{{to_state}} {{to_zipcode}}</td></tr>
<tr><td><b>Origin</b></td><td>{{from_street}},{{from_city}},{{from_state}} {{from_zipcode}}</td></tr>
<tr><td><b>Request By</b></td><td>{{req_firstname}} {{req_lastname}}</td></tr>
<tr><td><b>Patient Name</b></td><td>{{firstname}} {{lastname}} {{patient_number}}</td></tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
You will receive further messages as the status of the request changes.
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
{{site_name}} Team
<br>
{{server_name}}
</td>
</tr>
<tr>
<td class="footer" bgcolor="#493D26">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" class="footercopy">
&reg; {{site_name}} 2018<br/>
This is a support email from {{site_name}}.
</td>
</tr>
<tr>
<td align="center" style="padding: 20px 0 0 0;">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{facebook}}">
<img src="https://{{server_name}}/assets/images/brands/facebook.png" width="37" height="37" alt="Facebook" border="0" />
</a>
</td>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{twitter}}">
<img src="https://{{server_name}}/assets/images/brands/twitter.png" width="37" height="37" alt="Twitter" border="0" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</table>
<!--analytics-->
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</body>
</html>
@@ -0,0 +1,193 @@
Subject: Transport Request Confirmed
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{site_name}} - Transport Request</title>
<style type="text/css">
body {margin: 0; padding: 0; min-width: 100%!important;}
img {height: auto;}
.content {width: 100%; max-width: 600px;}
.header {padding: 20px 20px 20px 30px;}
.innerpadding {padding: 10px 10px 10px 10px;}
.borderbottom {border-bottom: 1px solid #f2eeed;}
.subhead {font-size: 12px; color: #ffffff; font-family: sans-serif; letter-spacing: 3px;}
.h1, .bodycopy {color: #153643; font-family: sans-serif;}
.h2 {color: #e6eeed; font-family: sans-serif;}
.h1 {font-size: 33px; line-height: 38px; font-weight: bold;}
.h2 {padding: 0 0 15px 0; font-size: 24px; line-height: 28px; font-weight: bold;}
.bodycopy {font-size: 14px; line-height: 20px;}
.button {text-align: center; font-size: 16px; font-family: sans-serif; font-weight: bold; padding: 0 20px 0 20px;}
.button a {color: #ffffff; text-decoration: none;}
.footer {padding: 20px 30px 15px 30px;}
.footercopy {font-family: sans-serif; font-size: 14px; color: #ffffff;}
.footercopy a {color: #ffffff; text-decoration: underline;}
@media only screen and (max-width: 550px), screen and (max-device-width: 550px) {
body[yahoo] .hide {display: none!important;}
body[yahoo] .buttonwrapper {background-color: transparent!important;}
body[yahoo] .button {padding: 0px!important;}
body[yahoo] .button a {background-color: #e05443; padding: 15px 15px 13px!important;}
body[yahoo] .unsubscribe {display: block; margin-top: 20px; padding: 10px 50px; background: #2f3942; border-radius: 5px; text-decoration: none!important; font-weight: bold;}
}
/*@media only screen and (min-device-width: 601px) {
.content {width: 600px !important;}
.col425 {width: 425px!important;}
.col380 {width: 380px!important;}
}*/
</style>
</head>
<body yahoo bgcolor="#f6f8f1">
<table width="100%" bgcolor="#f6f8f1" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<!--[if (gte mso 9)|(IE)]>
<table width="600" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table bgcolor="#ffffff" class="content" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td bgcolor="#19b9b3" class="header">
<!--[if (gte mso 9)|(IE)]>
<table width="425" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%; max-width: 425px;">
<tr>
<td height="50">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h1" style="padding: 5px 0 0 0;">
{{site_name}}
</td>
</tr>
<tr>
<td class="subhead" style="padding: 0 0 0 3px;">
{{site_trade_name}}
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h3">
Dear {{req_firstname}},
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<!--[if (gte mso 9)|(IE)]>
<table width="100%" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%;">
<tr>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="bodycopy">
Your transport request with details as shows below is now confirmed.
</td>
</tr>
<tr>
<td>
<table class="col425">
<tr><td><b>Date Time</b></td><td>{{long_date}}</td></tr>
<tr><td><b>Destination</b></td><td>{{to_street}},{{to_city}},{{to_state}} {{to_zipcode}}</td></tr>
<tr><td><b>Origin</b></td><td>{{from_street}},{{from_city}},{{from_state}} {{from_zipcode}}</td></tr>
<tr><td><b>Request By</b></td><td>{{req_firstname}} {{req_lastname}}</td></tr>
<tr><td><b>Patient Name</b></td><td>{{firstname}} {{lastname}} {{patient_number}}</td></tr>
<tr><td><b>Driver</b></td><td>{{driver_firstname}} {{driver_lastname}} [ {{agent_name}} ]</td></tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
.
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
{{site_name}} Team
<br>
{{server_name}}
</td>
</tr>
<tr>
<td class="footer" bgcolor="#493D26">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" class="footercopy">
&reg; {{site_name}} 2018<br/>
This is a support email from {{site_name}}.
</td>
</tr>
<tr>
<td align="center" style="padding: 20px 0 0 0;">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{facebook}}">
<img src="https://{{server_name}}/assets/images/brands/facebook.png" width="37" height="37" alt="Facebook" border="0" />
</a>
</td>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{twitter}}">
<img src="https://{{server_name}}/assets/images/brands/twitter.png" width="37" height="37" alt="Twitter" border="0" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</table>
<!--analytics-->
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</body>
</html>
+189
View File
@@ -0,0 +1,189 @@
Subject: {{site_name}} - Important Notification from {{site_name}}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{site_name}} - Log in Confirmation</title>
<style type="text/css">
body {margin: 0; padding: 0; min-width: 100%!important;}
img {height: auto;}
.content {width: 100%; max-width: 600px;}
.header {padding: 20px 20px 20px 30px;}
.innerpadding {padding: 10px 10px 10px 10px;}
.borderbottom {border-bottom: 1px solid #f2eeed;}
.subhead {font-size: 12px; color: #ffffff; font-family: sans-serif; letter-spacing: 3px;}
.h1, .bodycopy {color: #153643; font-family: sans-serif;}
.h2 {color: #e6eeed; font-family: sans-serif;}
.h1 {font-size: 33px; line-height: 38px; font-weight: bold;}
.h2 {padding: 0 0 15px 0; font-size: 24px; line-height: 28px; font-weight: bold;}
.bodycopy {font-size: 14px; line-height: 20px;}
.button {text-align: center; font-size: 16px; font-family: sans-serif; font-weight: bold; padding: 0 20px 0 20px;}
.button a {color: #ffffff; text-decoration: none;}
.footer {padding: 20px 30px 15px 30px;}
.footercopy {font-family: sans-serif; font-size: 14px; color: #ffffff;}
.footercopy a {color: #ffffff; text-decoration: underline;}
@media only screen and (max-width: 550px), screen and (max-device-width: 550px) {
body[yahoo] .hide {display: none!important;}
body[yahoo] .buttonwrapper {background-color: transparent!important;}
body[yahoo] .button {padding: 0px!important;}
body[yahoo] .button a {background-color: #e05443; padding: 15px 15px 13px!important;}
body[yahoo] .unsubscribe {display: block; margin-top: 20px; padding: 10px 50px; background: #2f3942; border-radius: 5px; text-decoration: none!important; font-weight: bold;}
}
/*@media only screen and (min-device-width: 601px) {
.content {width: 600px !important;}
.col425 {width: 425px!important;}
.col380 {width: 380px!important;}
}*/
</style>
</head>
<body yahoo bgcolor="#f6f8f1">
<table width="100%" bgcolor="#f6f8f1" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<!--[if (gte mso 9)|(IE)]>
<table width="600" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table bgcolor="#ffffff" class="content" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td bgcolor="#19b9b3" class="header">
<!--[if (gte mso 9)|(IE)]>
<table width="425" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%; max-width: 425px;">
<tr>
<td height="50">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h1" style="padding: 5px 0 0 0;">
{{site_name}}
</td>
</tr>
<tr>
<td class="subhead" style="padding: 0 0 0 3px;">
{{site_trade_name}}
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h3">
Dear <b>{{firstname}}</b>,
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<!--[if (gte mso 9)|(IE)]>
<table width="100%" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%;">
<tr>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="bodycopy">
Please be informed that you logged on to {{site_name}} account at {{last_login2}} from {{loc}}.
</td>
</tr>
<tr>
<td class="bodycopy">
If you did not log on to your account at the time detailed above, please contact us immediately.
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
For all support, contact us at <a href="{{contactus}}">{{contactus}}</a>
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
{{site_name}} Team
<br>
{{server_name}}
</td>
</tr>
<tr>
<td class="footer" bgcolor="#44525f">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" class="footercopy">
&reg; {{site_name}} 2017<br/>
You received this email because you subscribe to {{site_name}}. If you get this email in error, please <a href="{{contactus}}" class="unsubscribe"><font color="#ffffff">contact</font></a> us.
</td>
</tr>
<tr>
<td align="center" style="padding: 20px 0 0 0;">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{facebook}}">
<img src="https://{{server_name}}/assets/images/brands/facebook.png" width="37" height="37" alt="Facebook" border="0" />
</a>
</td>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{twitter}}">
<img src="https://{{server_name}}/assets/images/brands/twitter.png" width="37" height="37" alt="Twitter" border="0" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</table>
<!--analytics-->
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</body>
</html>
+177
View File
@@ -0,0 +1,177 @@
Subject: {{site_name}} - Welcome to {{site_name}}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{site_name}} - Welcome to {{site_name}} </title>
<style type="text/css">
body {margin: 0; padding: 0; min-width: 100%!important;}
img {height: auto;}
.content {width: 100%; max-width: 600px;}
.header {padding: 10px 10px 10px 10px;}
.innerpadding {padding: 10px 10px 10px 10px;}
.borderbottom {border-bottom: 1px solid #f2eeed;}
.subhead {font-size: 12px; color: #ffffff; font-family: sans-serif; letter-spacing: 3px;}
.h1, .bodycopy {color: #153643; font-family: sans-serif;}
.h2 {color: #e6eeed; font-family: sans-serif;}
.h1 {font-size: 33px; line-height: 38px; font-weight: bold;}
.h2 {padding: 0 0 15px 0; font-size: 24px; line-height: 28px; font-weight: bold;}
.bodycopy {font-size: 14px; line-height: 20px;}
.button {text-align: center; font-size: 16px; font-family: sans-serif; font-weight: bold; padding: 0 20px 0 20px;}
.button a {color: #ffffff; text-decoration: none;}
.footer {padding: 20px 30px 15px 30px;}
.footercopy {font-family: sans-serif; font-size: 14px; color: #ffffff;}
.footercopy a {color: #ffffff; text-decoration: underline;}
</style>
</head>
<body yahoo bgcolor="#f6f8f1">
<table width="100%" bgcolor="#f6f8f1" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<!--[if (gte mso 9)|(IE)]>
<table width="600" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table bgcolor="#ffffff" class="content" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td bgcolor="#19b9b3" class="header">
<!--[if (gte mso 9)|(IE)]>
<table width="425" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%; max-width: 425px;">
<tr>
<td height="50">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h1" style="padding: 5px 0 0 0;">
{{site_name}}
</td>
</tr>
<tr>
<td class="subhead" style="padding: 0 0 0 3px;">
{{site_trade_name}}
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="h3">
Dear <b>{{firstname}}</b>,
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="innerpadding borderbottom">
<!--[if (gte mso 9)|(IE)]>
<table width="100%" align="left" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<table class="col425" align="left" border="0" cellpadding="0" cellspacing="0" style="width: 100%;">
<tr>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="bodycopy">
Welcome to {{site_name}}, your username is {{email}}.
</td>
</tr>
<tr>
<td class="bodycopy">
<br>
If you did not create this account, please contact us immediately.
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
For all support, contact us at <a href="{{contactus}}">{{contactus}}</a>
</td>
</tr>
<tr>
<td class="innerpadding bodycopy">
{{site_name}} Team
<br>
{{server_name}}
</td>
</tr>
<tr>
<td class="footer" bgcolor="#493D26">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" class="footercopy">
&reg; {{site_name}} 2018<br/>
This is a support email from {{site_name}}.
</td>
</tr>
<tr>
<td align="center" style="padding: 20px 0 0 0;">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{facebook}}">
<img src="https://{{server_name}}/assets/images/brands/facebook.png" width="37" height="37" alt="Facebook" border="0" />
</a>
</td>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{{twitter}}">
<img src="https://{{server_name}}/assets/images/brands/twitter.png" width="37" height="37" alt="Twitter" border="0" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</table>
<!--analytics-->
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</body>
</html>
+67
View File
@@ -0,0 +1,67 @@
# JUBABOX API configuration file
version = "1.0";
system:
{
live = "0";
base_url = "http://oameye.works.jubabox.com/";
profile_picture_bad ="\\192.168.2.155\jubabox\TEST\profile";
profile_picture ="/opt/jubabox/TEST/profile";
profile_picture_width = "450";
profile_picture_height = "450";
profile_picture_size = "51200";
};
database:
{
host = "127.0.0.1";
name = "savvy";
user = "savvy";
pass = "savvy001!";
port = 5432;
};
mailsend:
{
from = "savvy@chiefsoft.com";
server = "smtp.google.com";
domain = "chiefsoft.com";
user = "savvy@chiefsoft.com";
pass = "may12002!";
name = "Savvy Demo";
};
mailsendOLD:
{
from = "support@wrenchboard.com";
server = "smtp.gmail.com";
domain = "kleenapp.com";
user = "support@wrenchboard.com";
pass = "may12002!";
name = "Kleen Demo Support";
};
stripe:
{
publishable_key = "pk_test_X7TylEk9BkZCarcj0FyKRYXc";
secret_key = "sk_test_MA2ltfGlT70Nu7uWlmHowBRB";
};
alerts:
{
system = "ses66181@gmail.com,ameye@chiefsoft.com";
request = "ses66181@gmail.com";
account = "ses66181@gmail.com";
};
transnotif:
{
contact = "ses66181@gmail.com,support@jubabox.com,ameye@fluxtra.net";
topupemail = "ses66181@gmail.com,ameye@chiefsoft.com";
};
+33
View File
@@ -0,0 +1,33 @@
PHP_ARG_ENABLE(jubabox_api,
[Whether to enable the "jubabox_api" extension],
[ --enable-jubabox_api Enable "jubabox_api" extension support])
if test $PHP_JUBABOX_API != "no"; then
PHP_REQUIRE_CXX()
PHP_SUBST(JUBABOX_API_SHARED_LIBADD)
PHP_ADD_LIBRARY(stdc++, 1, JUBABOX_API_SHARED_LIBADD)
PHP_ADD_INCLUDE(/usr/include/pgsql)
PHP_ADD_LIBRARY_WITH_PATH(pq, /usr/lib64, JUBABOX_API_SHARED_LIBADD)
PHP_ADD_LIBRARY(curl, 1, JUBABOX_API_SHARED_LIBADD)
PHP_ADD_LIBRARY(config++, 1, JUBABOX_API_SHARED_LIBADD)
PHP_ADD_LIBRARY(json-c, 1, JUBABOX_API_SHARED_LIBADD)
PHP_ADD_LIBRARY(ssl, 1, JUBABOX_API_SHARED_LIBADD)
PHP_ADD_LIBRARY(z, 1, JUBABOX_API_SHARED_LIBADD)
PHP_ADD_LIBRARY(pcrecpp, 1, JUBABOX_API_SHARED_LIBADD)
PHP_ADD_LIBRARY(gcc_s, 1, JUBABOX_API_SHARED_LIBADD)
LIBCFG_DIR="`pwd`/libconfig-1.3.1"
PHP_ADD_LIBRARY_WITH_PATH(config++, "$LIBCFG_DIR/.libs/")
PHP_NEW_EXTENSION(
jubabox_api,
core/*.cc shared_tool/*.cc,
$ext_shared,
,-I@ext_srcdir@/libconfig-1.3.1)
PHP_DEFINE([JUBABOX_API_NS],[\"jubabox_api_`id -u -n`\"],[])
PHP_DEFINE([JUBABOX_CONFIG],[\"`pwd|sed s/src//`etc/\"],[])
PHP_DEFINE([JUBABOX_LOG],[\"`pwd|sed s/src//`logs/jubabox_api.log\"],[])
PHP_DEFINE([TMPL_PREFIX],[\"`pwd|sed s/src//`email/\"],[])
PHP_DEFINE([FILELOG_MAX_LEVEL],[9],[])
fi
+58
View File
@@ -0,0 +1,58 @@
#include "cfg.h"
#include "libconfig.h++"
#include <iostream>
using namespace libconfig;
Config cfg;
void CfgReadConfig() {
try {
/* Load the configuration.. */
cfg.readFile(JUBABOX_CONFIG\
"/jubabox_api.conf");
} catch (...) {
// failure
}
}
long CfgReadLong(const char* key) {
if (key!=NULL) {
try {
Setting& s = cfg.lookup(key);
long ret = s;
return ret;
} catch (...) {
// failure
std::cout << "missing: " << key << std::endl;
}
}
return -1;
}
/*
std::string CfgReadString(const char* key) {
if (key!=NULL) {
try {
return (std::string)cfg.lookup(key);
} catch (...) {
// failure
}
}
return NULL;
}
*/
const char* CfgReadChar(const char* key) {
if (key!=NULL) {
try {
return (const char*)cfg.lookup(key);
} catch (...) {
// failure
std::cout << "missing: " << key << std::endl;
}
}
return "";
}
/*
vi:ts=2
*/
File diff suppressed because it is too large Load Diff
+42
View File
@@ -0,0 +1,42 @@
#include "clog.h"
#include "php_jubabox_log.h"
void logfmt( TLogLevel level, const char * format, ... ) {
try {
//FILELog::ReportingLevel() = level;
va_list args;
va_start (args, format);
if (level > FILELOG_MAX_LEVEL) ;
else if (level > FILELog::ReportingLevel() || !Output2FILE::Stream()) ;
else {
FILE *f = Output2FILE::Stream();
fprintf(f, "- %s %s [%ld]: %c",
NowTime().c_str(),
FILELog::ToString(level).c_str(),
getpid(),
(level > logDEBUG ? level - logDEBUG : 0, '\t'));
vfprintf(f, format, args);
fprintf(f, "\n");
}
va_end (args);
} catch(const std::exception& e) {
FILE_LOG(logERROR) << e.what();
}
}
/*
void logfmt( TLogLevel level, const char * format, ... ) {
try {
//FILELog::ReportingLevel() = level;
char buffer[2048];
va_list args;
va_start (args, format);
vsprintf (buffer, format, args);
//perror (buffer);
va_end (args);
FILE_LOG(level) << buffer;
} catch(const std::exception& e) {
FILE_LOG(logERROR) << e.what();
}
}
*/
+415
View File
@@ -0,0 +1,415 @@
#include <cassert>
#include <cstdarg>
#include <string>
#include <stdlib.h>
#include <string.h>
#include "cvariables.h"
#include "safestring.h"
CVariables::CVariables( )
{
var_top = NULL;
};
void CVariables::Cleanup()
{
L_Variables * v, *_v;
v = var_top;
while (v)
{
_v = v->next;
free( v->value );
delete v;
v = _v;
}
var_top = NULL; // Used when the desctructor is called explicitly to cleanup
}
CVariables::~CVariables()
{
// LOG( "~CVariables()", LOG_MAX );
Cleanup();
// LOG( "/~CVariables()", LOG_MAX );
}
L_Variables * CVariables::FindVariable( const char * var, bool create/*=false*/ )
{
L_Variables * v;
char _var[MAX_CGI_VAR_LEN+1];
tolower( var, _var, sizeof(_var) );
if (!var_top && !create)
return NULL;
if (!var_top)
{
v = var_top = new L_Variables;
}
else
{ // Search to see if such variable already exists
v = var_top;
do {
if ( strcmp( v->name, _var )==0 )
{
return v;
}
if ( v->next)
v = v->next;
else
break;
} while ( 1 );
// no variable found
if ( create )
{
v->next = new L_Variables;
v = v->next;
}
else
return NULL;
}
v->next = NULL;
strncpy( v->name, _var, MAX_CGI_VAR_LEN );
v->value = NULL; // So we know the space has not been allocated
return v;
}
char * CVariables::GetVariable( const char * var )
{
L_Variables * v;
v = FindVariable( var );
if ( !v )
return NULL;
else
return v->value;
}
bool CVariables::GetBool( char * var, bool test /*= false*/, char * section /*= ""*/ )
{
L_Variables * v;
v = FindVariable( var );
if ( !v )
return false;
else
{
char * s = v->value;
return
strcasecmp( s, "yes" )==0 ||
strcasecmp( s, "on" )==0 ||
strcasecmp( s, "1" )==0 ||
strcasecmp( s, "enable" )==0 ||
strcasecmp( s, "enabled" )==0 ||
strcasecmp( s, "true" )==0 ;
}
}
char * CVariables::GetVariable( const char * var, bool test, char * section /*= ""*/ )
{
L_Variables * v;
char name_[MAX_CGI_VAR_LEN+1];
strsafecpy( name_, test?".":"", sizeof( name_ ) );
strsafecat( name_, section, sizeof(name_) );
if (section[0])
strsafecat( name_, "_", sizeof(name_) );
strsafecat( name_, var, sizeof(name_) );
v = FindVariable( name_ );
if ( !v )
return NULL;
else
return v->value;
}
char * CVariables::GetVariable( const char * var, char * result, int size )
{
L_Variables * v;
v = FindVariable( var );
if ( !v )
result[0] = 0;
else
{
strncpy( result, v->value, size );
result[size-1] = 0;
}
return result;
}
long CVariables::GetVariableLong( char * name, bool *valid /*= NULL*/ )
{
char var[20];
GetVariable( name, var, sizeof(var) );
// if (!valid)
// return atol( var );
char * ep;
long res = strtol( var, &ep, 10 );
if (valid)
*valid = var[0] && !*ep;
return res;
}
long CVariables::GetVariableLong( char * name, bool test, char * section /*= ""*/ )
{
char name_[MAX_CGI_VAR_LEN+1];
strsafecpy( name_, test?".":"", sizeof( name_ ) );
strsafecat( name_, section, sizeof(name_) );
if (section[0])
strsafecat( name_, "_", sizeof(name_) );
strsafecat( name_, name, sizeof(name_) );
char var[20];
GetVariable( name_, var, sizeof(var) );
return atol( var );
}
void CVariables::LetInt16( char * var, int value )
{
L_Variables * v;
v = FindVariable( var, true );
if (v->value)
free( v->value );
char st[10];
snprintf( st, sizeof(st), "%d", value);
v->value = strdup( st );
}
void CVariables::LetStr( const char * var, const char * value ) // NULL-terminated
{
L_Variables * v;
v = FindVariable( var, true );
if (v->value)
free( v->value );
if ( value )
v->value = strdup( value );
else
v->value = strdup( "" );
}
void CVariables::RenameVariable( const char * name, const char * newname )
{
L_Variables * v;
v = FindVariable( name, true );
//logfmt( FLOG_MAX, "RenameVariable(): '%s'->'%s'", name, newname );
if ( !v )
{
//logfmt( FLOG_MAX, "RenameVariable(): Variable '%s' not found", name );
return;
}
strsafecpy( v->name, newname, sizeof( v->name ) );
}
void CVariables::vLetStrf( char * var, const char * format, va_list ap )
{
size_t buf_size = 512;
char *buffer = new char[buf_size];
size_t length;
while (true) {
if (!buffer) {
assert(buffer); // to stop when debugging
snprintf(buffer, buf_size, "<alloc problem>");
break;
}
length = vsnprintf(buffer, buf_size, format, ap);
if (length >= 0 && length < buf_size - 1) {
// string fits into current buffer
break;
}
// otherwise resize buffer :
buf_size *= 2;
// fprintf(stderr, "Reallocating vstrf-buffer to size=%u\n", buf_size);
delete [] buffer;
buffer = new char[buf_size];
}
L_Variables * v;
v = FindVariable( var, true );
if (v->value)
free( v->value );
if (buffer) {
v->value = strdup( buffer );
delete [] buffer;
} else {
v->value = strdup( "" );
}
}
void CVariables::LetStrf( char * var, const char * format, ... )
{
va_list ap;
va_start( ap, format );
vLetStrf( var, format, ap );
va_end( ap );
}
/*
void CVariables::LetStrf( char * var, const char * format, ... )
{
char tmp[1000];
va_list ap;
va_start( ap, format );
vsnprintf( tmp, sizeof(tmp), format, ap );
va_end( ap );
L_Variables * v;
v = FindVariable( var, true );
if (v->value)
free( v->value );
v->value = strdup( tmp );
}
*/
void CVariables::StrCat( char * var, const char * format, ... )
{
char tmp[1000];
L_Variables * v;
v = FindVariable( var, true );
va_list ap;
va_start( ap, format );
if ( !v->value )
vsnprintf( tmp, sizeof(tmp), format, ap );
else
{
// logfmt( FLOG_MAX, "v->value='%s'", v->value );
strsafecpy( tmp, v->value, sizeof(tmp) );
strsafecat( tmp, "<br>", sizeof(tmp) );
int len = strlen(tmp);
vsnprintf( &tmp[len], sizeof(tmp)-len, format, ap );
}
va_end( ap );
if (v->value)
free( v->value );
v->value = strdup( tmp );
// logfmt( FLOG_MAX, "tmp='%s'", tmp );
}
void CVariables::StrCatf( char * var, const char * format, ... )
{
char tmp[5000];
L_Variables * v;
v = FindVariable( var, true );
va_list ap;
va_start( ap, format );
if ( !v->value )
vsnprintf( tmp, sizeof(tmp), format, ap );
else
{
// logfmt( FLOG_MAX, "v->value='%s'", v->value );
strsafecpy( tmp, v->value, sizeof(tmp) );
//strsafecat( tmp, "<br>", sizeof(tmp) );
int len = strlen(tmp);
vsnprintf( &tmp[len], sizeof(tmp)-len, format, ap );
}
va_end( ap );
if (v->value)
free( v->value );
v->value = strdup( tmp );
// logfmt( FLOG_MAX, "tmp='%s'", tmp );
}
void CVariables::LetStr( char * var, const char * value, int len ) // non-NULL terminated
{
L_Variables * v;
v = FindVariable( var, true );
if (v->value)
free( v->value );
if ( value )
{
v->value = (char*)malloc(len+1);
memcpy( v->value, value, len );
v->value[len] = 0;
}
else
v->value = strdup( "" );
}
void CVariables::PrintVars( FILE * f /*= stdout*/ )
{
L_Variables * v;
v = var_top;
fprintf( f, "\nVariable listing (NEW):\n\n" );
while ( v )
{
fprintf( f, "%s[%d] = %s\n", v->name, strlen(v->value), v->value );
v = v->next;
}
}
/*
vi:ts=2
*/
+16
View File
@@ -0,0 +1,16 @@
#include "exceptions.h"
#include "clog.h"
bad_parameter::bad_parameter( CVars &out, const char *name )
{
//in["bad_param"] = name;
out["bad_param"] = name;
logfmt( FLOG_MAX, "Bad parameter exception: '%s'", name );
}
err::err( char *msg ) {
logfmt( FLOG_MAX, "ERROR: %s", msg );
}
+544
View File
@@ -0,0 +1,544 @@
/*-
* HMAC-SHA-224/256/384/512 implementation
* Last update: 06/15/2005
* Issue date: 06/15/2005
*
* Copyright (C) 2005 Olivier Gay <olivier.gay@a3.epfl.ch>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the project nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <string.h>
#include "hmac_sha2.h"
/* HMAC-SHA-224 functions */
void hmac_sha224_init(hmac_sha224_ctx *ctx, unsigned char *key,
unsigned int key_size)
{
unsigned int fill;
unsigned int num;
unsigned char *key_used;
unsigned char key_temp[SHA224_DIGEST_SIZE];
int i;
if (key_size == SHA224_BLOCK_SIZE) {
key_used = key;
num = SHA224_BLOCK_SIZE;
} else {
if (key_size > SHA224_BLOCK_SIZE){
key_used = key_temp;
num = SHA224_DIGEST_SIZE;
sha224(key, key_size, key_used);
} else { /* key_size > SHA224_BLOCK_SIZE */
key_used = key;
num = key_size;
}
fill = SHA224_BLOCK_SIZE - num;
memset(ctx->block_ipad + num, 0x36, fill);
memset(ctx->block_opad + num, 0x5c, fill);
}
for (i = 0; i < num; i++) {
ctx->block_ipad[i] = key_used[i] ^ 0x36;
ctx->block_opad[i] = key_used[i] ^ 0x5c;
}
sha224_init(&ctx->ctx_inside);
sha224_update(&ctx->ctx_inside, ctx->block_ipad, SHA224_BLOCK_SIZE);
sha224_init(&ctx->ctx_outside);
sha224_update(&ctx->ctx_outside, ctx->block_opad,
SHA224_BLOCK_SIZE);
/* for hmac_reinit */
memcpy(&ctx->ctx_inside_reinit, &ctx->ctx_inside,
sizeof(sha224_ctx));
memcpy(&ctx->ctx_outside_reinit, &ctx->ctx_outside,
sizeof(sha224_ctx));
}
void hmac_sha224_reinit(hmac_sha224_ctx *ctx)
{
memcpy(&ctx->ctx_inside, &ctx->ctx_inside_reinit,
sizeof(sha224_ctx));
memcpy(&ctx->ctx_outside, &ctx->ctx_outside_reinit,
sizeof(sha224_ctx));
}
void hmac_sha224_update(hmac_sha224_ctx *ctx, unsigned char *message,
unsigned int message_len)
{
sha224_update(&ctx->ctx_inside, message, message_len);
}
void hmac_sha224_final(hmac_sha224_ctx *ctx, unsigned char *mac,
unsigned int mac_size)
{
unsigned char digest_inside[SHA224_DIGEST_SIZE];
unsigned char mac_temp[SHA224_DIGEST_SIZE];
sha224_final(&ctx->ctx_inside, digest_inside);
sha224_update(&ctx->ctx_outside, digest_inside, SHA224_DIGEST_SIZE);
sha224_final(&ctx->ctx_outside, mac_temp);
memcpy(mac, mac_temp, mac_size);
}
void hmac_sha224(unsigned char *key, unsigned int key_size,
unsigned char *message, unsigned int message_len,
unsigned char *mac, unsigned mac_size)
{
hmac_sha224_ctx ctx;
hmac_sha224_init(&ctx, key, key_size);
hmac_sha224_update(&ctx, message, message_len);
hmac_sha224_final(&ctx, mac, mac_size);
}
/* HMAC-SHA-256 functions */
void hmac_sha256_init(hmac_sha256_ctx *ctx, unsigned char *key,
unsigned int key_size)
{
unsigned int fill;
unsigned int num;
unsigned char *key_used;
unsigned char key_temp[SHA256_DIGEST_SIZE];
int i;
if (key_size == SHA256_BLOCK_SIZE) {
key_used = key;
num = SHA256_BLOCK_SIZE;
} else {
if (key_size > SHA256_BLOCK_SIZE){
key_used = key_temp;
num = SHA256_DIGEST_SIZE;
sha256(key, key_size, key_used);
} else { /* key_size > SHA256_BLOCK_SIZE */
key_used = key;
num = key_size;
}
fill = SHA256_BLOCK_SIZE - num;
memset(ctx->block_ipad + num, 0x36, fill);
memset(ctx->block_opad + num, 0x5c, fill);
}
for (i = 0; i < num; i++) {
ctx->block_ipad[i] = key_used[i] ^ 0x36;
ctx->block_opad[i] = key_used[i] ^ 0x5c;
}
sha256_init(&ctx->ctx_inside);
sha256_update(&ctx->ctx_inside, ctx->block_ipad, SHA256_BLOCK_SIZE);
sha256_init(&ctx->ctx_outside);
sha256_update(&ctx->ctx_outside, ctx->block_opad,
SHA256_BLOCK_SIZE);
/* for hmac_reinit */
memcpy(&ctx->ctx_inside_reinit, &ctx->ctx_inside,
sizeof(sha256_ctx));
memcpy(&ctx->ctx_outside_reinit, &ctx->ctx_outside,
sizeof(sha256_ctx));
}
void hmac_sha256_reinit(hmac_sha256_ctx *ctx)
{
memcpy(&ctx->ctx_inside, &ctx->ctx_inside_reinit,
sizeof(sha256_ctx));
memcpy(&ctx->ctx_outside, &ctx->ctx_outside_reinit,
sizeof(sha256_ctx));
}
void hmac_sha256_update(hmac_sha256_ctx *ctx, unsigned char *message,
unsigned int message_len)
{
sha256_update(&ctx->ctx_inside, message, message_len);
}
void hmac_sha256_final(hmac_sha256_ctx *ctx, unsigned char *mac,
unsigned int mac_size)
{
unsigned char digest_inside[SHA256_DIGEST_SIZE];
unsigned char mac_temp[SHA256_DIGEST_SIZE];
sha256_final(&ctx->ctx_inside, digest_inside);
sha256_update(&ctx->ctx_outside, digest_inside, SHA256_DIGEST_SIZE);
sha256_final(&ctx->ctx_outside, mac_temp);
memcpy(mac, mac_temp, mac_size);
}
void hmac_sha256(unsigned char *key, unsigned int key_size,
unsigned char *message, unsigned int message_len,
unsigned char *mac, unsigned mac_size)
{
hmac_sha256_ctx ctx;
hmac_sha256_init(&ctx, key, key_size);
hmac_sha256_update(&ctx, message, message_len);
hmac_sha256_final(&ctx, mac, mac_size);
}
/* HMAC-SHA-384 functions */
void hmac_sha384_init(hmac_sha384_ctx *ctx, unsigned char *key,
unsigned int key_size)
{
unsigned int fill;
unsigned int num;
unsigned char *key_used;
unsigned char key_temp[SHA384_DIGEST_SIZE];
int i;
if (key_size == SHA384_BLOCK_SIZE) {
key_used = key;
num = SHA384_BLOCK_SIZE;
} else {
if (key_size > SHA384_BLOCK_SIZE){
key_used = key_temp;
num = SHA384_DIGEST_SIZE;
sha384(key, key_size, key_used);
} else { /* key_size > SHA384_BLOCK_SIZE */
key_used = key;
num = key_size;
}
fill = SHA384_BLOCK_SIZE - num;
memset(ctx->block_ipad + num, 0x36, fill);
memset(ctx->block_opad + num, 0x5c, fill);
}
for (i = 0; i < num; i++) {
ctx->block_ipad[i] = key_used[i] ^ 0x36;
ctx->block_opad[i] = key_used[i] ^ 0x5c;
}
sha384_init(&ctx->ctx_inside);
sha384_update(&ctx->ctx_inside, ctx->block_ipad, SHA384_BLOCK_SIZE);
sha384_init(&ctx->ctx_outside);
sha384_update(&ctx->ctx_outside, ctx->block_opad,
SHA384_BLOCK_SIZE);
/* for hmac_reinit */
memcpy(&ctx->ctx_inside_reinit, &ctx->ctx_inside,
sizeof(sha384_ctx));
memcpy(&ctx->ctx_outside_reinit, &ctx->ctx_outside,
sizeof(sha384_ctx));
}
void hmac_sha384_reinit(hmac_sha384_ctx *ctx)
{
memcpy(&ctx->ctx_inside, &ctx->ctx_inside_reinit,
sizeof(sha384_ctx));
memcpy(&ctx->ctx_outside, &ctx->ctx_outside_reinit,
sizeof(sha384_ctx));
}
void hmac_sha384_update(hmac_sha384_ctx *ctx, unsigned char *message,
unsigned int message_len)
{
sha384_update(&ctx->ctx_inside, message, message_len);
}
void hmac_sha384_final(hmac_sha384_ctx *ctx, unsigned char *mac,
unsigned int mac_size)
{
unsigned char digest_inside[SHA384_DIGEST_SIZE];
unsigned char mac_temp[SHA384_DIGEST_SIZE];
sha384_final(&ctx->ctx_inside, digest_inside);
sha384_update(&ctx->ctx_outside, digest_inside, SHA384_DIGEST_SIZE);
sha384_final(&ctx->ctx_outside, mac_temp);
memcpy(mac, mac_temp, mac_size);
}
void hmac_sha384(unsigned char *key, unsigned int key_size,
unsigned char *message, unsigned int message_len,
unsigned char *mac, unsigned mac_size)
{
hmac_sha384_ctx ctx;
hmac_sha384_init(&ctx, key, key_size);
hmac_sha384_update(&ctx, message, message_len);
hmac_sha384_final(&ctx, mac, mac_size);
}
/* HMAC-SHA-512 functions */
void hmac_sha512_init(hmac_sha512_ctx *ctx, unsigned char *key,
unsigned int key_size)
{
unsigned int fill;
unsigned int num;
unsigned char *key_used;
unsigned char key_temp[SHA512_DIGEST_SIZE];
int i;
if (key_size == SHA512_BLOCK_SIZE) {
key_used = key;
num = SHA512_BLOCK_SIZE;
} else {
if (key_size > SHA512_BLOCK_SIZE){
key_used = key_temp;
num = SHA512_DIGEST_SIZE;
sha512(key, key_size, key_used);
} else { /* key_size > SHA512_BLOCK_SIZE */
key_used = key;
num = key_size;
}
fill = SHA512_BLOCK_SIZE - num;
memset(ctx->block_ipad + num, 0x36, fill);
memset(ctx->block_opad + num, 0x5c, fill);
}
for (i = 0; i < num; i++) {
ctx->block_ipad[i] = key_used[i] ^ 0x36;
ctx->block_opad[i] = key_used[i] ^ 0x5c;
}
sha512_init(&ctx->ctx_inside);
sha512_update(&ctx->ctx_inside, ctx->block_ipad, SHA512_BLOCK_SIZE);
sha512_init(&ctx->ctx_outside);
sha512_update(&ctx->ctx_outside, ctx->block_opad,
SHA512_BLOCK_SIZE);
/* for hmac_reinit */
memcpy(&ctx->ctx_inside_reinit, &ctx->ctx_inside,
sizeof(sha512_ctx));
memcpy(&ctx->ctx_outside_reinit, &ctx->ctx_outside,
sizeof(sha512_ctx));
}
void hmac_sha512_reinit(hmac_sha512_ctx *ctx)
{
memcpy(&ctx->ctx_inside, &ctx->ctx_inside_reinit,
sizeof(sha512_ctx));
memcpy(&ctx->ctx_outside, &ctx->ctx_outside_reinit,
sizeof(sha512_ctx));
}
void hmac_sha512_update(hmac_sha512_ctx *ctx, unsigned char *message,
unsigned int message_len)
{
sha512_update(&ctx->ctx_inside, message, message_len);
}
void hmac_sha512_final(hmac_sha512_ctx *ctx, unsigned char *mac,
unsigned int mac_size)
{
unsigned char digest_inside[SHA512_DIGEST_SIZE];
unsigned char mac_temp[SHA512_DIGEST_SIZE];
sha512_final(&ctx->ctx_inside, digest_inside);
sha512_update(&ctx->ctx_outside, digest_inside, SHA512_DIGEST_SIZE);
sha512_final(&ctx->ctx_outside, mac_temp);
memcpy(mac, mac_temp, mac_size);
}
void hmac_sha512(unsigned char *key, unsigned int key_size,
unsigned char *message, unsigned int message_len,
unsigned char *mac, unsigned mac_size)
{
hmac_sha512_ctx ctx;
hmac_sha512_init(&ctx, key, key_size);
hmac_sha512_update(&ctx, message, message_len);
hmac_sha512_final(&ctx, mac, mac_size);
}
#ifdef TEST_VECTORS
/* IETF Validation tests */
#include <stdio.h>
#include <stdlib.h>
void test(unsigned char *vector, unsigned char *digest,
unsigned int digest_size)
{
unsigned char output[2 * SHA512_DIGEST_SIZE + 1];
int i;
output[2 * digest_size] = '\0';
for (i = 0; i < digest_size ; i++) {
sprintf((char *) output + 2*i, "%02x", digest[i]);
}
printf("H: %s\n", output);
if (strcmp((char *) vector, (char *) output)) {
fprintf(stderr, "Test failed.\n");
exit(1);
}
}
int main()
{
static unsigned char *vectors[] =
{
/* HMAC-SHA-224 */
"896fb1128abbdf196832107cd49df33f47b4b1169912ba4f53684b22",
"a30e01098bc6dbbf45690f3a7e9e6d0f8bbea2a39e6148008fd05e44",
"7fb3cb3588c6c1f6ffa9694d7d6ad2649365b0c1f65d69d1ec8333ea",
"6c11506874013cac6a2abc1bb382627cec6a90d86efc012de7afec5a",
"0e2aea68a90c8d37c988bcdb9fca6fa8",
"95e9a0db962095adaebe9b2d6f0dbce2d499f112f2d2b7273fa6870e",
"3a854166ac5d9f023f54d517d0b39dbd946770db9c2b95c9f6f565d1",
/* HMAC-SHA-256 */
"b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7",
"5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843",
"773ea91e36800e46854db8ebd09181a72959098b3ef8c122d9635514ced565fe",
"82558a389a443c0ea4cc819899f2083a85f0faa3e578f8077a2e3ff46729665b",
"a3b6167473100ee06e0c796c2955552b",
"60e431591ee0b67f0d8a26aacbf5b77f8e0bc6213728c5140546040f0ee37f54",
"9b09ffa71b942fcb27635fbcd5b0e944bfdc63644f0713938a7f51535c3a35e2",
/* HMAC-SHA-384 */
"afd03944d84895626b0825f4ab46907f15f9dadbe4101ec682aa034c7cebc59c"
"faea9ea9076ede7f4af152e8b2fa9cb6",
"af45d2e376484031617f78d2b58a6b1b9c7ef464f5a01b47e42ec3736322445e"
"8e2240ca5e69e2c78b3239ecfab21649",
"88062608d3e6ad8a0aa2ace014c8a86f0aa635d947ac9febe83ef4e55966144b"
"2a5ab39dc13814b94e3ab6e101a34f27",
"3e8a69b7783c25851933ab6290af6ca77a9981480850009cc5577c6e1f573b4e"
"6801dd23c4a7d679ccf8a386c674cffb",
"3abf34c3503b2a23a46efc619baef897",
"4ece084485813e9088d2c63a041bc5b44f9ef1012a2b588f3cd11f05033ac4c6"
"0c2ef6ab4030fe8296248df163f44952",
"6617178e941f020d351e2f254e8fd32c602420feb0b8fb9adccebb82461e99c5"
"a678cc31e799176d3860e6110c46523e",
/* HMAC-SHA-512 */
"87aa7cdea5ef619d4ff0b4241a1d6cb02379f4e2ce4ec2787ad0b30545e17cde"
"daa833b7d6b8a702038b274eaea3f4e4be9d914eeb61f1702e696c203a126854",
"164b7a7bfcf819e2e395fbe73b56e0a387bd64222e831fd610270cd7ea250554"
"9758bf75c05a994a6d034f65f8f0e6fdcaeab1a34d4a6b4b636e070a38bce737",
"fa73b0089d56a284efb0f0756c890be9b1b5dbdd8ee81a3655f83e33b2279d39"
"bf3e848279a722c806b485a47e67c807b946a337bee8942674278859e13292fb",
"b0ba465637458c6990e5a8c5f61d4af7e576d97ff94b872de76f8050361ee3db"
"a91ca5c11aa25eb4d679275cc5788063a5f19741120c4f2de2adebeb10a298dd",
"415fad6271580a531d4179bc891d87a6",
"80b24263c7c1a3ebb71493c1dd7be8b49b46d1f41b4aeec1121b013783f8f352"
"6b56d037e05f2598bd0fd2215d6a1e5295e64f73f63f0aec8b915a985d786598",
"e37b6a775dc87dbaa4dfa9f96e5e3ffddebd71f8867289865df5a32d20cdc944"
"b6022cac3c4982b10d5eeb55c3e4de15134676fb6de0446065c97440fa8c6a58"
};
static unsigned char *messages[] =
{
"Hi There",
"what do ya want for nothing?",
NULL,
NULL,
"Test With Truncation",
"Test Using Larger Than Block-Size Key - Hash Key First",
"This is a test using a larger than block-size key "
"and a larger than block-size data. The key needs"
" to be hashed before being used by the HMAC algorithm."
};
unsigned char mac[SHA512_DIGEST_SIZE];
unsigned char *keys[7];
unsigned int keys_len[7] = {20, 4, 20, 25, 20, 131, 131};
unsigned int messages2and3_len = 50;
unsigned int mac_224_size, mac_256_size, mac_384_size, mac_512_size;
int i;
for (i = 0; i < 7; i++) {
keys[i] = malloc(keys_len[i]);
if (keys[i] == NULL) {
fprintf(stderr, "Can't allocate memory\n");
return 1;
}
}
memset(keys[0], 0x0b, keys_len[0]);
strcpy(keys[1], "Jefe");
memset(keys[2], 0xaa, keys_len[2]);
for (i = 0; i < keys_len[3]; i++)
keys[3][i] = (unsigned char) i + 1;
memset(keys[4], 0x0c, keys_len[4]);
memset(keys[5], 0xaa, keys_len[5]);
memset(keys[6], 0xaa, keys_len[6]);
messages[2] = malloc(messages2and3_len + 1);
messages[3] = malloc(messages2and3_len + 1);
if (messages[2] == NULL || messages[3] == NULL) {
fprintf(stderr, "Can't allocate memory\n");
return 1;
}
messages[2][messages2and3_len] = '\0';
messages[3][messages2and3_len] = '\0';
memset(messages[2], 0xdd, messages2and3_len);
memset(messages[3], 0xcd, messages2and3_len);
printf("HMAC-SHA-2 IETF Validation tests\n\n");
for (i = 0; i < 7; i++) {
if (i != 4) {
mac_224_size = SHA224_DIGEST_SIZE;
mac_256_size = SHA256_DIGEST_SIZE;
mac_384_size = SHA384_DIGEST_SIZE;
mac_512_size = SHA512_DIGEST_SIZE;
} else {
mac_224_size = 128 / 8; mac_256_size = 128 / 8;
mac_384_size = 128 / 8; mac_512_size = 128 / 8;
}
printf("Test %d:\n", i + 1);
hmac_sha224(keys[i], keys_len[i], messages[i], strlen(messages[i]),
mac, mac_224_size);
test(vectors[i], mac, mac_224_size );
hmac_sha256(keys[i], keys_len[i], messages[i], strlen(messages[i]),
mac, mac_256_size);
test(vectors[7 + i], mac, mac_256_size);
hmac_sha384(keys[i], keys_len[i], messages[i], strlen(messages[i]),
mac, mac_384_size);
test(vectors[14 + i], mac, mac_384_size);
hmac_sha512(keys[i], keys_len[i], messages[i], strlen(messages[i]),
mac, mac_512_size);
test(vectors[21 + i], mac, mac_512_size);
}
printf("All tests passed.\n");
return 0;
}
#endif /* TEST_VECTORS */
+71
View File
@@ -0,0 +1,71 @@
#include "input.h"
#include "clog.h"
#include "util.h"
#include <cstring>
#include <cstdlib>
/******************************************************************************/
void REQ_STRING( CVars &in, const char * name, int min_len, int max_len, const char *regex ) throw (bad_parameter)
{
int len = in[name].length();
char ret[2048]; ret[0] = 0;
logfmt( FLOG_MAX, "REQ_STRING(%s)", name );
bool match = reg_match( in[name].c_str(), regex, ret, sizeof(ret) );
len = strlen(ret);
if ( !match || len < min_len || len > max_len )
{
logfmt( FLOG_MAX, "Error in parameter '%s', len= %d <= %d <= %d", name, min_len, match, max_len );
in[name].set_valid( false );
throw bad_parameter( in, name );
}
in[name] = ret;
CVars::iterator i = in.find( name );
i->second.set_valid();
//logfmt( FLOG_MAX, "i->second.valid()=%d", i->second.valid() );
// if not match regexp
}
/******************************************************************************/
long REQ_LONG( CVars &in, const char *name, long min, long max )
{
char *end;
long r = strtol( in[name].c_str(), &end, 10 );
if ( in[name].length() && !*end )
{
in[name].set_valid();
return r;
}
else
{
in[name].set_valid( false );
throw bad_parameter( in, name );
}
return r;
}
/******************************************************************************/
bool OptionalSpecified( CVars &in, const char * name )
{
if ( in.find(name)==in.end() ) return false; // parameter omitted, not even passed from frontend
return ! reg_match( in[name].c_str(), "^[[:space:]]*$", NULL, 0 );
}
/******************************************************************************/
/*
vi:ts=2
*/
+75
View File
@@ -0,0 +1,75 @@
#include "jubabox.h"
#include "clog.h"
#include "cfg.h"
#include "exceptions.h"
#include "input.h"
#include "jubabox_api.h"
#include "pgsql.h"
#include "jubabox_api_main.h"
#include <iostream>
#include <libpq-fe.h>
JubaBox::JubaBox() {
// Open config
this->pFile = fopen(JUBABOX_LOG, "a");
Output2FILE::Stream() = pFile;
FILE_LOG(logINFO) << "JUBABOX is starting...";
CfgReadConfig();
logfmt(logINFO, "Version from config: %s", CfgReadChar("version"));
// Open database
FILE_LOG(logDEBUG) << "Connecting to database...";
FILE_LOG(logDEBUG) << "host=" << CfgReadChar("database.host") << ", name=" << CfgReadChar("database.name") << ", user=" << CfgReadChar("database.user") << ", pass=***hidden***, port=" << CfgReadLong("database.port");
this->db = 0;
try {
this->db = pgsql_db_connect(CfgReadChar("database.host"),
CfgReadChar("database.name"),
CfgReadChar("database.user"),
CfgReadChar("database.pass"),
CfgReadLong("database.port") );
} catch (...) {
logfmt(logDEBUG, "Exception!");
}
logfmt(logDEBUG, "Database connection %s", this->db>0?"successful":"failed");
}
long JubaBox::jubabox_api(CVars in, CVars &out) {
long retval = PHP_API_BAD_PARAM;
try {
retval = jubabox_api_main(in, out);
} catch (bad_parameter) {
out["status"] = "Incorrect input parameter";
} catch (...) {
out["status"] = "Unhandled exception";
}
return retval;
}
const char* JubaBox::cfgReadChar(const char *parameter) {
return CfgReadChar(parameter);
}
long JubaBox::cfgReadLong(const char *parameter) {
return CfgReadLong(parameter);
}
void JubaBox::logMessage(const char *message) {
FILE_LOG(logINFO) << message;
}
JubaBox::~JubaBox() {
FILE_LOG(logINFO) << "JUBABOX is stopping...";
if (db>0) {
FILE_LOG(logDEBUG) << "Closing database connection";
pgsql_close();
}
// Do we need it?
if (this->pFile) {
fclose(this->pFile);
}
}
+270
View File
@@ -0,0 +1,270 @@
#include "php_jubabox_api.h"
#include "php_jubabox_api_ns.h"
#include "jubabox.h"
#include "cfg.h"
#include "clog.h"
#include "vars.h"
#include "safestring.h"
#include <string.h>
#include <map>
#include <ext/standard/info.h>
using namespace std;
zend_object_handlers jubabox_object_handlers;
struct jubabox_object {
zend_object std;
JubaBox *jubabox;
};
zend_class_entry *jubabox_ce;
void jubabox_free_storage(void *object TSRMLS_DC)
{
jubabox_object *obj = (jubabox_object *)object;
delete obj->jubabox;
zend_hash_destroy(obj->std.properties);
FREE_HASHTABLE(obj->std.properties);
efree(obj);
}
zend_object_value jubabox_create_handler(zend_class_entry *type TSRMLS_DC)
{
zval *tmp;
zend_object_value retval;
jubabox_object *obj = (jubabox_object *)emalloc(sizeof(jubabox_object));
memset(obj, 0, sizeof(jubabox_object));
obj->std.ce = type;
ALLOC_HASHTABLE(obj->std.properties);
zend_hash_init(obj->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
#if PHP_VERSION_ID < 50399
zend_hash_copy(obj->std.properties, &type->default_properties,
(copy_ctor_func_t)zval_add_ref, (void *)&tmp, sizeof(zval *));
#else
object_properties_init((zend_object*) &(obj->std), type);
#endif
retval.handle = zend_objects_store_put(obj, NULL,
jubabox_free_storage, NULL TSRMLS_CC);
retval.handlers = &jubabox_object_handlers;
return retval;
}
#define SET_ENV( env ) \
if (zend_hash_find(Z_ARRVAL_PP(array), env, sizeof(env), (void **) &token) == SUCCESS) {\
setenv( env, Z_STRVAL_PP(token), 1 ); \
logfmt( logINFO, env " = %s", Z_STRVAL_PP(token) ); \
} else {\
unsetenv( env );\
}
PHP_METHOD(JubaBox, __construct)
{
JubaBox *jubabox = NULL;
zval *object = getThis();
jubabox = new JubaBox();
jubabox_object *obj = (jubabox_object *)zend_object_store_get_object(object TSRMLS_CC);
obj->jubabox = jubabox;
zval **array;
zval **token;
zend_is_auto_global("_SERVER", sizeof("_SERVER")-1 TSRMLS_CC);
if (zend_hash_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER"), (void **) &array) == SUCCESS &&
Z_TYPE_PP(array) == IS_ARRAY) {
logfmt( logINFO, "_SERVER found" );
SET_ENV( "REMOTE_ADDR" );
SET_ENV( "SERVER_NAME" );
SET_ENV( "HTTP_COOKIE" );
SET_ENV( "QUERY_STRING" );
SET_ENV( "HTTP_X_FORWARDED_FOR" );
} else {
logfmt( logINFO, "_SERVER not found" );
}
}
PHP_METHOD(JubaBox, jubabox_api)
{
zval *param, *param_out;
CVars input, output;
JubaBox *jubabox;
jubabox_object *obj = (jubabox_object *)zend_object_store_get_object(
getThis() TSRMLS_CC);
jubabox = obj->jubabox;
if (jubabox != NULL) {
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, const_cast<char *>("zz"), &param, &param_out ) == FAILURE ) {
// Bad parameters
RETURN_NULL();
}
if (!PZVAL_IS_REF(param_out)) {
// out is not a reference
/* This is not relevant in PHP 5.4 */
#if PHP_VERSION_ID < 50399
zend_error(E_WARNING, "Second parameter wasn't passed by reference");
RETURN_NULL();
#endif
}
HashTable *hash;
char *key;
uint key_len;
zval **value;
convert_to_array_ex( &param );
hash = HASH_OF( param );
zend_hash_internal_pointer_reset( hash );
while ( zend_hash_get_current_key( hash, &key, /*num_index*/ NULL, /*duplicate*/ false ) == HASH_KEY_IS_STRING ) {
zend_hash_get_current_data( hash, (void**)&value );
convert_to_string_ex( value );
input[ key ] = Z_STRVAL_PP(value);
zend_hash_move_forward( hash );
}
long retval = jubabox->jubabox_api(input, output);
convert_to_array_ex( &param_out );
CVars::iterator i;
int j = 0;
const int out_size = output.size(); // 200
const int out_value_size = 200;
char out_key[out_value_size], out_value[out_value_size];
for ( i=output.begin(); i != output.end() && j<out_size ; i++ ) {
bzero(out_key, out_value_size);
bzero(out_value, out_value_size);
j++;
logfmt( logINFO, "RET: %s=%s", i->first.c_str(), i->second.c_str() );
strsafecpy( out_key, i->first.c_str(), out_value_size );
strsafecpy( out_value, i->second.c_str(), out_value_size );
add_assoc_string( param_out, out_key, out_value, true );
}
RETURN_LONG(retval);
}
RETURN_NULL();
}
PHP_METHOD(JubaBox, cfgReadChar)
{
JubaBox *jubabox;
jubabox_object *obj = (jubabox_object *)zend_object_store_get_object(
getThis() TSRMLS_CC);
jubabox = obj->jubabox;
if (jubabox != NULL) {
char *parameter;
int parameter_len;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, const_cast<char *>("s"), &parameter, &parameter_len) == FAILURE) {
RETURN_NULL();
}
if (parameter_len == 0) {
RETURN_NULL();
}
RETURN_STRING(jubabox->cfgReadChar(parameter),1);
}
RETURN_NULL();
}
PHP_METHOD(JubaBox, cfgReadLong)
{
JubaBox *jubabox;
jubabox_object *obj = (jubabox_object *)zend_object_store_get_object(
getThis() TSRMLS_CC);
jubabox = obj->jubabox;
if (jubabox != NULL) {
char *parameter;
int parameter_len;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, const_cast<char *>("s"), &parameter, &parameter_len) == FAILURE) {
RETURN_NULL();
}
if (parameter_len == 0) {
RETURN_NULL();
}
RETURN_LONG(jubabox->cfgReadLong(parameter));
}
RETURN_NULL();
}
PHP_METHOD(JubaBox, logMessage)
{
JubaBox *jubabox;
jubabox_object *obj = (jubabox_object *)zend_object_store_get_object(
getThis() TSRMLS_CC);
jubabox = obj->jubabox;
if (jubabox != NULL) {
char *message;
int message_len;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, const_cast<char *>("s"), &message, &message_len) == FAILURE) {
RETURN_FALSE;
}
if (message_len == 0) {
RETURN_FALSE;
}
jubabox->logMessage((const char *)message);
}
RETURN_TRUE;
}
#if PHP_VERSION_ID < 50399
function_entry jubabox_methods[] = {
#else
zend_function_entry jubabox_methods[] = {
#endif
PHP_ME(JubaBox, __construct, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
PHP_ME(JubaBox, jubabox_api, NULL, ZEND_ACC_PUBLIC)
PHP_ME(JubaBox, cfgReadChar, NULL, ZEND_ACC_PUBLIC)
PHP_ME(JubaBox, cfgReadLong, NULL, ZEND_ACC_PUBLIC)
PHP_ME(JubaBox, logMessage, NULL, ZEND_ACC_PUBLIC)
{NULL, NULL, NULL}
};
PHP_MINIT_FUNCTION(jubabox_api)
{
zend_class_entry ce;
INIT_NS_CLASS_ENTRY(ce, JUBABOX_API_NS, "JubaBox", jubabox_methods);
//INIT_CLASS_ENTRY(ce, "JubaBox", jubabox_methods);
jubabox_ce = zend_register_internal_class(&ce TSRMLS_CC);
jubabox_ce->create_object = jubabox_create_handler;
memcpy(&jubabox_object_handlers,
zend_get_std_object_handlers(), sizeof(zend_object_handlers));
jubabox_object_handlers.clone_obj = NULL;
return SUCCESS;
}
PHP_MINFO_FUNCTION(jubabox_api)
{
php_info_print_table_start();
php_info_print_table_row(2, "JUBABOX API support", "enabled");
php_info_print_table_row(2, "Log File", JUBABOX_LOG);
php_info_print_table_row(2, "Config File", JUBABOX_CONFIG"jubabox_api.conf");
php_info_print_table_row(2, "Build Date", __DATE__);
php_info_print_table_row(2, "Build Time", __TIME__);
php_info_print_table_row(2, "JUBABOX API Version", PHP_JUBABOX_API_EXTVER);
php_info_print_table_end();
}
zend_module_entry jubabox_api_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
STANDARD_MODULE_HEADER,
#endif
JUBABOX_API_NS,
NULL, /* Functions */
PHP_MINIT(jubabox_api),
NULL, /* MSHUTDOWN */
NULL, /* RINIT */
NULL, /* RSHUTDOWN */
PHP_MINFO(jubabox_api), /* MINFO */
#if ZEND_MODULE_API_NO >= 20010901
PHP_JUBABOX_API_EXTVER,
#endif
STANDARD_MODULE_PROPERTIES
};
#ifdef COMPILE_DL_JUBABOX_API
extern "C" {
ZEND_GET_MODULE(jubabox_api)
}
#endif
+82
View File
@@ -0,0 +1,82 @@
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"
void DestroyList( TList * top )
{
// LOG( "DestroyList()", LOG_MAX );
TList * cur = top; unsigned long pos=0;
TList * prev;
while ( cur && cur->text)
{
free( cur->text );
prev = cur;
cur = cur->next;
delete prev;
}
// LOG( "/DestroyList()", LOG_MAX );
}
TList * Add( TList * list, char * text, long size )
{
if (!text)
return list;
list->text = new char[ size+1 ];
memcpy( list->text, text, size );
list->text[size] = 0;
// logfmt( FLOG_MAX, "Added: '%s'", list->text );
list->next = new TList;
list->next->next = NULL;
list->next->text = NULL;
return list->next;
}
TList * AddF( TList * list, char * format, ... )
{
if (!format)
return list;
int size;
va_list ap;
va_start( ap, format );
size = vsnprintf( NULL, 0, format, ap ) + 1;
list->text = new char[ size ];
if ( !list->text) return list; // out of mem => do nothing
vsnprintf( list->text, size-1, format, ap );
va_end( ap );
list->text[size] = 0;
// logfmt( FLOG_MAX, "Added: '%s'", list->text );
list->next = new TList;
list->next->next = NULL;
list->next->text = NULL;
return list->next;
}
void PrintList( TList * list )
{
// LOG( "PrintList()", LOG_MAX );
TList * cur = list;
while (cur && cur->text)
{
// LOG( cur->text, LOG_MAX );
cur = cur->next;
}
// LOG( "/PrintList()", LOG_MAX );
}
+216
View File
@@ -0,0 +1,216 @@
#include "pgsql.h"
#include "clog.h"
#include <string>
#include <iostream>
PGconn *conn;
int pgsql_db_connect(const char*host,const char*name,const char*user,const char*pass,long port)
{
FILE_LOG(logSQL) << "pgsql_db_connect()";
static std::string connection_str;
if(host) {
connection_str+="host=";
connection_str+=host;
}
if(name) {
connection_str+=" dbname=";
connection_str+=name;
}
if(user) {
connection_str+=" user=";
connection_str+=user;
}
if(pass) {
connection_str+=" password=";
connection_str+=pass;
}
if(port>0) {
char pdb_port[20];
connection_str+=" port=";
connection_str+=pgsql_uitoa(port,pdb_port,10);
}
conn = PQconnectdb(connection_str.c_str());
if (PQstatus(conn) != CONNECTION_OK) {
return 0;
}
return 1;
}
void pgsql_close()
{
FILE_LOG(logSQL) << "pgsql_close()";
if (PQstatus(conn)==CONNECTION_OK) {
PQfinish(conn);
}
}
int pgsql_exec(const char * format, ... )
{
FILE_LOG(logSQL) << "pgsql_exec()";
char query[16384];
va_list args;
va_start (args, format);
vsprintf (query, format, args);
//perror (buffer);
va_end (args);
FILE_LOG(logSQL) << "About to run query: ";
FILE_LOG(logSQL) << query;
/* Escape any PostgrsSQL-unsafe characters */
// user_size = PQescapeStringConn (conn, user_data, username, strlen(username), &pqesc_error);
int num = 0;
char *cmdTuples = NULL;
PGresult *res = PQexec(conn, query);
if(!res) {
/* Error */
FILE_LOG(logSQL) << "Error: NULL result";
num = -1;
} else {
switch (PQresultStatus(res)) {
case PGRES_TUPLES_OK:
case PGRES_COMMAND_OK:
cmdTuples = PQcmdTuples(res);
FILE_LOG(logSQL) << "PQcmdTuples: " << cmdTuples;
num = atoi(cmdTuples);
break;
case PGRES_EMPTY_QUERY:
case PGRES_BAD_RESPONSE:
case PGRES_NONFATAL_ERROR:
case PGRES_FATAL_ERROR:
case PGRES_COPY_OUT:
case PGRES_COPY_IN:
num = -1;
break;
}
}
if (num<0) {
FILE_LOG(logSQL) << "Affected rows: ERROR";
} else {
FILE_LOG(logSQL) << "Affected rows: " << num;
}
return num;
}
const PGresult* pgsql_query(const char * format, ... )
{
FILE_LOG(logSQL) << "pgsql_query()";
char query[16384];
va_list args;
va_start (args, format);
vsprintf (query, format, args);
//perror (buffer);
va_end (args);
FILE_LOG(logSQL) << "About to run query: ";
FILE_LOG(logSQL) << query;
/* Escape any PostgrsSQL-unsafe characters */
// user_size = PQescapeStringConn (conn, user_data, username, strlen(username), &pqesc_error);
int num = 0;
const PGresult *res = PQexec(conn, query);
if(!res) {
/* Error */
num = -1;
FILE_LOG(logSQL) << "Error: NULL result";
} else {
switch (PQresultStatus(res)) {
case PGRES_TUPLES_OK:
case PGRES_COMMAND_OK:
num = PQntuples(res);
FILE_LOG(logSQL) << "Found rows: " << num;
break;
case PGRES_EMPTY_QUERY:
case PGRES_BAD_RESPONSE:
case PGRES_NONFATAL_ERROR:
case PGRES_FATAL_ERROR:
case PGRES_COPY_OUT:
case PGRES_COPY_IN:
num = -1;
break;
}
}
if (num>0) {
return res;
}
FILE_LOG(logSQL) << "Found rows: " << (num<0?"ERROR":"0");
return NULL;
}
int pgsql_num_rows(const PGresult *res)
{
if (res) {
return PQntuples(res);
}
return 0;
}
int pgsql_num_fields(const PGresult *res)
{
if (res) {
return PQnfields(res);
}
return 0;
}
map<const char*,const char*> pgsql_fetch_assoc(const PGresult *res, int row)
{
map<const char*, const char*> result;
if (res) {
const int rows = PQntuples(res);
if (rows>0 && row<rows) {
const int num = PQnfields(res);
if (num>0) {
for (int i=0; i<num; i++) {
result[PQfname(res,i)] = PQgetvalue(res,row,i);
}
return result;
}
}
}
return result;
}
vector<const char*> pgsql_fetch_row(const PGresult *res, int row)
{
vector<const char*> result;
if (res) {
const int rows = PQntuples(res);
if (rows>0 && row<rows) {
const int num = PQnfields(res);
if (num>0) {
for (int i=0; i<num; i++) {
result.push_back(PQgetvalue(res,row,i));
}
return result;
}
}
}
return result;
}
char * pgsql_uitoa(unsigned n, char *s, int radix)
{
static const char tab[] =
"0123456789abcdef";
char *p = s;
char *q = s;
/* generate digits in reverse order */
do {
*p++ = tab[n % radix];
n /= radix;
} while (n != 0);
*p-- = '\0';
/* reverse digits */
while (q < p) {
int temp = *p;
*p-- = *q;
*q++ = temp;
}
return s;
}
/*
vi:ts=2
*/
+362
View File
@@ -0,0 +1,362 @@
#include "pgsql.h"
#include "pgsql_wrapper.h"
#include "clog.h"
#include <safestring.h>
#include <string>
#include <iostream>
#include <cassert>
#include <cstdarg>
#include <cstring>
#include <cstdlib>
void map_to_cvars(map<const char *,const char *>f, CVars &rec)
{
map<const char *,const char *>::iterator it;
for(it = f.begin(); it != f.end(); it++) {
logfmt( logINFO, "f[%s] = %s", it->first, it->second );
rec[it->first] = it->second;
}
}
void load_db_record( const char * table, CVars &rec, const char * where, ... )
{
logfmt( FLOG_MAX, "void load_db_record( const char * table, CVars &rec, const char * where, ... )");
size_t buf_size = 512;
char *buffer = new char[buf_size];
va_list argPtr;
size_t length;
std::string cmd;
while (true) {
if (!buffer) {
assert(buffer); // to stop when debugging
cmd = std::string("<alloc problem>", 16);
break;
}
va_start(argPtr, where);
length = vsnprintf(buffer, buf_size, where, argPtr);
va_end(argPtr);
if (length >= 0 && length < buf_size - 1) {
// string fits into current buffer
cmd = std::string(buffer, length);
break;
}
// otherwise resize buffer :
buf_size *= 2;
// fprintf(stderr, "Reallocating vstrf-buffer to size=%u\n", buf_size);
delete [] buffer;
buffer = new char[buf_size];
}
const PGresult* res = pgsql_query("SELECT * FROM %s WHERE %s", table, cmd.c_str() );
if( buffer ) delete [] buffer;
if (!res || pgsql_num_rows(res)!=1) return;
map<const char*,const char*>f = pgsql_fetch_assoc(res, 0);
logfmt( FLOG_MAX, "load_db_record(%s) num_cols=%d", table, f.size() );
if (f.empty()) {
return;
}
map<const char *,const char *>::iterator it;
for(it = f.begin(); it != f.end(); it++) {
rec[ it->first ] = it->second;
}
}
// This function now supports binary data
long load_db_record( CVars &rec, const char * query, ... )
{
logfmt( FLOG_MAX, "long load_db_record( CVars &rec, const char * query, ... )");
size_t buf_size = 512;
char *buffer = new char[buf_size];
va_list argPtr;
size_t length;
std::string cmd;
while (true) {
if (!buffer) {
assert(buffer); // to stop when debugging
cmd = std::string("<alloc problem>", 16);
break;
}
va_start(argPtr, query);
length = vsnprintf(buffer, buf_size, query, argPtr);
va_end(argPtr);
if (length >= 0 && length < buf_size - 1) {
// string fits into current buffer
cmd = std::string(buffer, length);
break;
}
// otherwise resize buffer :
buf_size *= 2;
// fprintf(stderr, "Reallocating vstrf-buffer to size=%u\n", buf_size);
delete [] buffer;
buffer = new char[buf_size];
}
const PGresult* res = pgsql_query("%s", cmd.c_str() );
if( buffer ) delete [] buffer;
if (!res || pgsql_num_rows(res)!=1) return -1l;
map<const char*,const char*>f = pgsql_fetch_assoc(res, 0);
logfmt( FLOG_MAX, "load_db_record(%s) num_cols=%d", cmd.c_str(), f.size() );
if (f.empty()) {
return 0l;
}
map<const char *,const char *>::iterator it;
for(it = f.begin(); it != f.end(); it++) {
rec[ it->first ] = it->second;
}
return 1l;
}
#define MAX_BINARY_PARS 20
long insert_db_record( int mode, const char *table, const char *seq, CVars &rec )
{
CVars::const_iterator i;
char cmd[128]; /*cols[1024], vals[1024]; cols[0] = 0; vals[0] = 0;*/
bool first = true;
string cols, vals;
int bind_i = 0;
long int sz[MAX_BINARY_PARS]; bzero( sz, sizeof(sz) ); // provides binding for all binary columns simultaneously
int binary_i = 0;
logfmt( FLOG_MAX, "insert_db_record()" );
snprintf( cmd, sizeof(cmd), "INSERT INTO %s (%%s) VALUES (%%s)", table );
for ( i=rec.begin(); i != rec.end(); i++ )
{
NEED_ESC;
// logfmt( FLOG_MAX, "'%s': i->second.valid()=%d, db()=%d", i->first.c_str(), i->second.valid(), i->second.db() );
if ( (DBS_VALID & mode) && !i->second.valid() ) continue;
if ( (DBS_STREAM & mode ) && !i->second.db() ) continue;
//logfmt( FLOG_MAX, "insert_db_record(): %s = %s", i->first.c_str(), i->second.c_str() );
cols += string(first?"":",") + i->first;
if ( !first ) vals += ",";
if ( i->second.binary() )
{
/*
vals += '?';
sz[binary_i] = i->second.size();
char *data = (char*)i->second.data();
//logfmt( FLOG_MAX, "saving binary parameter '%s', len = %d", i->first.c_str(), i->second.size() );
SQLBindParameter( st.hstmt, ++bind_i, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_VARBINARY, sz[binary_i], 0, data, sz[binary_i], &sz[binary_i] );
if ( binary_i++ == MAX_BINARY_PARS )
{
logfmt( FLOG_MAX, "Exceeded maximum allowed binary parameters" );
return 0;
}
*/
throw err("Binary parameters are not supported");
}
else
vals += string("E'") + esc(i->second.c_str()) + "'";
/*strcatf( cols, sizeof(cols), "%s%s", first?"":",", i->first.c_str() );
strcatf( vals, sizeof(vals), "%s'%s'", first?"":",", i->second.c_str() );*/
first = false;
}
int res = pgsql_exec( cmd, cols.c_str(), vals.c_str() );
return curr_val( seq );
}
void update_db_record( int mode, const char * table, CVars &rec, long id, const char * where, ... ) throw ( bad_parameter )
{
va_list ap;
va_start( ap, where );
v_update_db_record( mode, table, rec, "id", id, where, ap );
va_end( ap );
}
void update_db_record( int mode, const char * table, CVars &rec, const char *index, long id, const char * where, ... ) throw ( bad_parameter )
{
va_list ap;
va_start( ap, where );
v_update_db_record( mode, table, rec, index, id, where, ap );
va_end( ap );
}
void v_update_db_record( int mode, const char * table, CVars &rec, const char *index, long id, const char * where, va_list ap ) throw ( bad_parameter )
{
logfmt( FLOG_MAX, "update_db_record()" );
int bind_i = 0;
if ( !id ) throw bad_parameter( rec, "id" );
CVars::const_iterator i;
char cmd[128];
bool first = true;
string cols;
char * wherestr;
snprintf( cmd, sizeof(cmd), "UPDATE %s SET %%s WHERE %s=%lu AND %%s", table, index, id );
for ( i=rec.begin(); i != rec.end(); i++ )
{
NEED_ESC;
if ( !i->second.valid() ) continue;
if ( (DBS_STREAM & mode) && !i->second.db() ) continue;
cols += string(first?"":",") + i->first + "=";
if ( ! i->second.binary() )
cols += string("E'") + esc(i->second.c_str()) + "'";
else
{
/*
cols += "?";
long int sz = i->second.size();
char *data = (char*)i->second.data();
SQLBindParameter( st.hstmt, ++bind_i, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_VARBINARY, sz, 0, data, sz, &sz );
*/
throw err("Binary data is not supported");
}
first = false;
}
if ( where )
{
int size = vsnprintf( NULL, 0, where, ap ) + 1;
wherestr = (char*)malloc( size );
if ( !wherestr ) throw err("malloc() error");
vsnprintf( wherestr, size, where, ap );
}
int rows = pgsql_exec( cmd, cols.c_str(), where?wherestr:"true" );
if ( where )
free( wherestr );
if ( rows!=1 ) throw bad_parameter( rec, "id" );
}
long curr_val( const char *seq )
{
long size = 20+strlen(seq);
char cmd[size];
snprintf( cmd, size, "SELECT currval('%s')", seq );
logfmt( FLOG_MAX, "%s", cmd);
const PGresult* res = pgsql_query( cmd );
if (res && pgsql_num_rows(res)>0) {
vector<const char *>f = pgsql_fetch_row(res,0);
if (!f.empty() && f.size()>0) {
return atol(f[0]);
}
}
logfmt( FLOG_MAX, "SQL error" );
return -1l;
}
//---------------------------- class CEscape ----------------
char * CEscape::New( int sz )
{
if ( ESCAPE_MAX_VARS==n )
{
logfmt( FLOG_MAX, "CEscape::New() Maximum number of variables reached" );
return NULL;
}
vars[n] = new char[sz];
n++;
return vars[n-1];
}
CEscape::CEscape( char * st )
{
n = 0;
this->st = st;
}
CEscape::~CEscape()
{
for ( int i=0; i<n; i++ )
delete vars[i];
n = 0;
}
char * CEscape::Escape( const char * param )
{
if ( !param ) return NULL;
int len = this->EscapeLength(param);
return this->EscapeReal( param, New(len), len );
}
int CEscape::EscapeLength( const char * par )
{
if ( !par ) return 0;
int i, len = strlen(par), extra = 0;
for ( i=0; i<len; i++ )
if ( par[i]=='\'' || par[i]=='\\' )
extra++;
return len+extra+1;
}
char * CEscape::EscapeReal( const char * cmd, char * _esc, int sz )
{
char * c, * c1, * d, *dend;
char * esc = _esc?_esc:this->esc;
if (!sz) sz = sizeof(this->esc);
c = (char*)cmd; esc[0] = 0; d = esc; dend = d+sz;
if ( !cmd ) return esc;
// LOG( cmd, LOG_MAX );
while ( c<cmd+strlen(cmd) )
{
c1 = c + strcspn( c, "'\\" ); // apostrophe and backslash
if ( !*c1 )
{
strsafecpy( d, c, dend-d );
break;
}
strnsafecpy( d, c, c1-c, dend-d );
d += strlen(d);
//if (*(c1+0)=='\'') strcatf( d, dend-d, "'%c", *c1 );
strcatf( d, dend-d, "\\%c", *c1 );
d += strlen(d);
c = c1+1;
}
// LOG( esc, LOG_MAX );
return esc;
}
//---------------------------------------------------------------------
+179
View File
@@ -0,0 +1,179 @@
#include "safestring.h"
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <stdarg.h>
char * strsafecpy( char * dest, const char * src, int size )
{
if ( src==dest ) return dest;
if ( size<=0 ) return dest;
dest[0] = 0;
if ( !src ) return dest;
int len = strlen( src );
if ( len>=size )
len = size-1; // to be safe
strncpy( dest, src, len );
dest[ len ] = 0;
return dest;
}
char * strnsafecpy( char * dest, const char * src, int n, int size )
{
if ( size<=0 ) return dest;
dest[0] = 0;
if ( !src ) return dest;
if ( n>=size )
n = size-1;
strncpy( dest, src, n );
dest[ n ] = 0;
return dest;
}
char * strsafecat( char * dest, const char * src, int size )
{
int len = strlen( src );
int start = strlen(dest);
size -= start;
if ( len>=size )
len = size-1; // to be safe
strncat( dest, src, len );
dest[ start+len ] = 0;
return dest;
}
char * strnsafecat( char * dest, const char * src, int n, int size )
{
int len = strlen( src );
if ( n<len ) len = n;
int start = strlen(dest);
size -= start;
if ( len>=size )
len = size-1; // to be safe
strncat( dest, src, len );
dest[ start+len ] = 0;
return dest;
}
char * strcatf( char * dest, int size, const char * fmt, ... )
{
va_list ap;
va_start( ap, fmt );
int len = strlen( dest );
if ( size-len > 0 )
vsnprintf( &dest[len], size-len, fmt, ap );
dest[ size-1 ] = 0;
va_end( ap );
return dest;
}
char * toupper( char * s, char * dest/*=NULL*/, int sz/*=0*/ )
{
if (!s) return NULL;
char *c = s;
char *d = dest?dest:s;
while (*c) {
if (d-dest>=sz-1) break;
*d = toupper(*c);
c++; d++;
}
*d = 0;
return dest?dest:s;
}
char * tolower( char * s, char * dest/*=NULL*/, int sz/*=0*/ )
{
if (!s) return NULL;
char *c = s;
char *d = dest?dest:s;
while (*c) {
if ( dest && (d-dest>=sz-1) ) break;
*d = tolower(*c);
c++; d++;
}
*d = 0;
return dest?dest:s;
}
char * toupper( const char * s, char * dest, int sz )
{
return toupper( (char*)s, dest, sz );
}
char * tolower( const char * s, char * dest, int sz )
{
return tolower( (char*)s, dest, sz );
}
char * last_line( char * buf ) // find the last line and return the pointer to its beginning
{
char * line = buf, *bufend = buf + strlen(buf);
while ( char * c = strpbrk( line, "\r\n" ) )
{
c += strspn( c, "\r\n" );
if ( c==bufend )
return line;
line = c;
}
return line;
}
char * safestrdup( const char *s )
{
return s ? strdup( s ) : NULL;
}
char * strreverse( char *s )
{
int len = strlen(s);
int end = len/2;
unsigned char c;
for ( int i=0; i<end; i++ )
{
c = s[i];
s[i] = s[len-i-1];
s[len-i-1] = c;
}
return s;
}
+950
View File
@@ -0,0 +1,950 @@
/*
* FIPS 180-2 SHA-224/256/384/512 implementation
* Last update: 02/02/2007
* Issue date: 04/30/2005
*
* Copyright (C) 2005, 2007 Olivier Gay <olivier.gay@a3.epfl.ch>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the project nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#if 0
#define UNROLL_LOOPS /* Enable loops unrolling */
#endif
#include <string.h>
#include "sha2.h"
#define SHFR(x, n) (x >> n)
#define ROTR(x, n) ((x >> n) | (x << ((sizeof(x) << 3) - n)))
#define ROTL(x, n) ((x << n) | (x >> ((sizeof(x) << 3) - n)))
#define CH(x, y, z) ((x & y) ^ (~x & z))
#define MAJ(x, y, z) ((x & y) ^ (x & z) ^ (y & z))
#define SHA256_F1(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22))
#define SHA256_F2(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25))
#define SHA256_F3(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHFR(x, 3))
#define SHA256_F4(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHFR(x, 10))
#define SHA512_F1(x) (ROTR(x, 28) ^ ROTR(x, 34) ^ ROTR(x, 39))
#define SHA512_F2(x) (ROTR(x, 14) ^ ROTR(x, 18) ^ ROTR(x, 41))
#define SHA512_F3(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHFR(x, 7))
#define SHA512_F4(x) (ROTR(x, 19) ^ ROTR(x, 61) ^ SHFR(x, 6))
#define UNPACK32(x, str) \
{ \
*((str) + 3) = (uint8) ((x) ); \
*((str) + 2) = (uint8) ((x) >> 8); \
*((str) + 1) = (uint8) ((x) >> 16); \
*((str) + 0) = (uint8) ((x) >> 24); \
}
#define PACK32(str, x) \
{ \
*(x) = ((uint32) *((str) + 3) ) \
| ((uint32) *((str) + 2) << 8) \
| ((uint32) *((str) + 1) << 16) \
| ((uint32) *((str) + 0) << 24); \
}
#define UNPACK64(x, str) \
{ \
*((str) + 7) = (uint8) ((x) ); \
*((str) + 6) = (uint8) ((x) >> 8); \
*((str) + 5) = (uint8) ((x) >> 16); \
*((str) + 4) = (uint8) ((x) >> 24); \
*((str) + 3) = (uint8) ((x) >> 32); \
*((str) + 2) = (uint8) ((x) >> 40); \
*((str) + 1) = (uint8) ((x) >> 48); \
*((str) + 0) = (uint8) ((x) >> 56); \
}
#define PACK64(str, x) \
{ \
*(x) = ((uint64) *((str) + 7) ) \
| ((uint64) *((str) + 6) << 8) \
| ((uint64) *((str) + 5) << 16) \
| ((uint64) *((str) + 4) << 24) \
| ((uint64) *((str) + 3) << 32) \
| ((uint64) *((str) + 2) << 40) \
| ((uint64) *((str) + 1) << 48) \
| ((uint64) *((str) + 0) << 56); \
}
/* Macros used for loops unrolling */
#define SHA256_SCR(i) \
{ \
w[i] = SHA256_F4(w[i - 2]) + w[i - 7] \
+ SHA256_F3(w[i - 15]) + w[i - 16]; \
}
#define SHA512_SCR(i) \
{ \
w[i] = SHA512_F4(w[i - 2]) + w[i - 7] \
+ SHA512_F3(w[i - 15]) + w[i - 16]; \
}
#define SHA256_EXP(a, b, c, d, e, f, g, h, j) \
{ \
t1 = wv[h] + SHA256_F2(wv[e]) + CH(wv[e], wv[f], wv[g]) \
+ sha256_k[j] + w[j]; \
t2 = SHA256_F1(wv[a]) + MAJ(wv[a], wv[b], wv[c]); \
wv[d] += t1; \
wv[h] = t1 + t2; \
}
#define SHA512_EXP(a, b, c, d, e, f, g ,h, j) \
{ \
t1 = wv[h] + SHA512_F2(wv[e]) + CH(wv[e], wv[f], wv[g]) \
+ sha512_k[j] + w[j]; \
t2 = SHA512_F1(wv[a]) + MAJ(wv[a], wv[b], wv[c]); \
wv[d] += t1; \
wv[h] = t1 + t2; \
}
uint32 sha224_h0[8] =
{0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,
0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4};
uint32 sha256_h0[8] =
{0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19};
uint64 sha384_h0[8] =
{0xcbbb9d5dc1059ed8ULL, 0x629a292a367cd507ULL,
0x9159015a3070dd17ULL, 0x152fecd8f70e5939ULL,
0x67332667ffc00b31ULL, 0x8eb44a8768581511ULL,
0xdb0c2e0d64f98fa7ULL, 0x47b5481dbefa4fa4ULL};
uint64 sha512_h0[8] =
{0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL,
0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL,
0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL,
0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL};
uint32 sha256_k[64] =
{0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2};
uint64 sha512_k[80] =
{0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,
0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,
0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,
0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,
0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,
0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,
0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,
0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,
0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,
0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,
0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,
0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,
0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,
0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL};
/* SHA-256 functions */
void sha256_transf(sha256_ctx *ctx, const unsigned char *message,
unsigned int block_nb)
{
uint32 w[64];
uint32 wv[8];
uint32 t1, t2;
const unsigned char *sub_block;
int i;
#ifndef UNROLL_LOOPS
int j;
#endif
for (i = 0; i < (int) block_nb; i++) {
sub_block = message + (i << 6);
#ifndef UNROLL_LOOPS
for (j = 0; j < 16; j++) {
PACK32(&sub_block[j << 2], &w[j]);
}
for (j = 16; j < 64; j++) {
SHA256_SCR(j);
}
for (j = 0; j < 8; j++) {
wv[j] = ctx->h[j];
}
for (j = 0; j < 64; j++) {
t1 = wv[7] + SHA256_F2(wv[4]) + CH(wv[4], wv[5], wv[6])
+ sha256_k[j] + w[j];
t2 = SHA256_F1(wv[0]) + MAJ(wv[0], wv[1], wv[2]);
wv[7] = wv[6];
wv[6] = wv[5];
wv[5] = wv[4];
wv[4] = wv[3] + t1;
wv[3] = wv[2];
wv[2] = wv[1];
wv[1] = wv[0];
wv[0] = t1 + t2;
}
for (j = 0; j < 8; j++) {
ctx->h[j] += wv[j];
}
#else
PACK32(&sub_block[ 0], &w[ 0]); PACK32(&sub_block[ 4], &w[ 1]);
PACK32(&sub_block[ 8], &w[ 2]); PACK32(&sub_block[12], &w[ 3]);
PACK32(&sub_block[16], &w[ 4]); PACK32(&sub_block[20], &w[ 5]);
PACK32(&sub_block[24], &w[ 6]); PACK32(&sub_block[28], &w[ 7]);
PACK32(&sub_block[32], &w[ 8]); PACK32(&sub_block[36], &w[ 9]);
PACK32(&sub_block[40], &w[10]); PACK32(&sub_block[44], &w[11]);
PACK32(&sub_block[48], &w[12]); PACK32(&sub_block[52], &w[13]);
PACK32(&sub_block[56], &w[14]); PACK32(&sub_block[60], &w[15]);
SHA256_SCR(16); SHA256_SCR(17); SHA256_SCR(18); SHA256_SCR(19);
SHA256_SCR(20); SHA256_SCR(21); SHA256_SCR(22); SHA256_SCR(23);
SHA256_SCR(24); SHA256_SCR(25); SHA256_SCR(26); SHA256_SCR(27);
SHA256_SCR(28); SHA256_SCR(29); SHA256_SCR(30); SHA256_SCR(31);
SHA256_SCR(32); SHA256_SCR(33); SHA256_SCR(34); SHA256_SCR(35);
SHA256_SCR(36); SHA256_SCR(37); SHA256_SCR(38); SHA256_SCR(39);
SHA256_SCR(40); SHA256_SCR(41); SHA256_SCR(42); SHA256_SCR(43);
SHA256_SCR(44); SHA256_SCR(45); SHA256_SCR(46); SHA256_SCR(47);
SHA256_SCR(48); SHA256_SCR(49); SHA256_SCR(50); SHA256_SCR(51);
SHA256_SCR(52); SHA256_SCR(53); SHA256_SCR(54); SHA256_SCR(55);
SHA256_SCR(56); SHA256_SCR(57); SHA256_SCR(58); SHA256_SCR(59);
SHA256_SCR(60); SHA256_SCR(61); SHA256_SCR(62); SHA256_SCR(63);
wv[0] = ctx->h[0]; wv[1] = ctx->h[1];
wv[2] = ctx->h[2]; wv[3] = ctx->h[3];
wv[4] = ctx->h[4]; wv[5] = ctx->h[5];
wv[6] = ctx->h[6]; wv[7] = ctx->h[7];
SHA256_EXP(0,1,2,3,4,5,6,7, 0); SHA256_EXP(7,0,1,2,3,4,5,6, 1);
SHA256_EXP(6,7,0,1,2,3,4,5, 2); SHA256_EXP(5,6,7,0,1,2,3,4, 3);
SHA256_EXP(4,5,6,7,0,1,2,3, 4); SHA256_EXP(3,4,5,6,7,0,1,2, 5);
SHA256_EXP(2,3,4,5,6,7,0,1, 6); SHA256_EXP(1,2,3,4,5,6,7,0, 7);
SHA256_EXP(0,1,2,3,4,5,6,7, 8); SHA256_EXP(7,0,1,2,3,4,5,6, 9);
SHA256_EXP(6,7,0,1,2,3,4,5,10); SHA256_EXP(5,6,7,0,1,2,3,4,11);
SHA256_EXP(4,5,6,7,0,1,2,3,12); SHA256_EXP(3,4,5,6,7,0,1,2,13);
SHA256_EXP(2,3,4,5,6,7,0,1,14); SHA256_EXP(1,2,3,4,5,6,7,0,15);
SHA256_EXP(0,1,2,3,4,5,6,7,16); SHA256_EXP(7,0,1,2,3,4,5,6,17);
SHA256_EXP(6,7,0,1,2,3,4,5,18); SHA256_EXP(5,6,7,0,1,2,3,4,19);
SHA256_EXP(4,5,6,7,0,1,2,3,20); SHA256_EXP(3,4,5,6,7,0,1,2,21);
SHA256_EXP(2,3,4,5,6,7,0,1,22); SHA256_EXP(1,2,3,4,5,6,7,0,23);
SHA256_EXP(0,1,2,3,4,5,6,7,24); SHA256_EXP(7,0,1,2,3,4,5,6,25);
SHA256_EXP(6,7,0,1,2,3,4,5,26); SHA256_EXP(5,6,7,0,1,2,3,4,27);
SHA256_EXP(4,5,6,7,0,1,2,3,28); SHA256_EXP(3,4,5,6,7,0,1,2,29);
SHA256_EXP(2,3,4,5,6,7,0,1,30); SHA256_EXP(1,2,3,4,5,6,7,0,31);
SHA256_EXP(0,1,2,3,4,5,6,7,32); SHA256_EXP(7,0,1,2,3,4,5,6,33);
SHA256_EXP(6,7,0,1,2,3,4,5,34); SHA256_EXP(5,6,7,0,1,2,3,4,35);
SHA256_EXP(4,5,6,7,0,1,2,3,36); SHA256_EXP(3,4,5,6,7,0,1,2,37);
SHA256_EXP(2,3,4,5,6,7,0,1,38); SHA256_EXP(1,2,3,4,5,6,7,0,39);
SHA256_EXP(0,1,2,3,4,5,6,7,40); SHA256_EXP(7,0,1,2,3,4,5,6,41);
SHA256_EXP(6,7,0,1,2,3,4,5,42); SHA256_EXP(5,6,7,0,1,2,3,4,43);
SHA256_EXP(4,5,6,7,0,1,2,3,44); SHA256_EXP(3,4,5,6,7,0,1,2,45);
SHA256_EXP(2,3,4,5,6,7,0,1,46); SHA256_EXP(1,2,3,4,5,6,7,0,47);
SHA256_EXP(0,1,2,3,4,5,6,7,48); SHA256_EXP(7,0,1,2,3,4,5,6,49);
SHA256_EXP(6,7,0,1,2,3,4,5,50); SHA256_EXP(5,6,7,0,1,2,3,4,51);
SHA256_EXP(4,5,6,7,0,1,2,3,52); SHA256_EXP(3,4,5,6,7,0,1,2,53);
SHA256_EXP(2,3,4,5,6,7,0,1,54); SHA256_EXP(1,2,3,4,5,6,7,0,55);
SHA256_EXP(0,1,2,3,4,5,6,7,56); SHA256_EXP(7,0,1,2,3,4,5,6,57);
SHA256_EXP(6,7,0,1,2,3,4,5,58); SHA256_EXP(5,6,7,0,1,2,3,4,59);
SHA256_EXP(4,5,6,7,0,1,2,3,60); SHA256_EXP(3,4,5,6,7,0,1,2,61);
SHA256_EXP(2,3,4,5,6,7,0,1,62); SHA256_EXP(1,2,3,4,5,6,7,0,63);
ctx->h[0] += wv[0]; ctx->h[1] += wv[1];
ctx->h[2] += wv[2]; ctx->h[3] += wv[3];
ctx->h[4] += wv[4]; ctx->h[5] += wv[5];
ctx->h[6] += wv[6]; ctx->h[7] += wv[7];
#endif /* !UNROLL_LOOPS */
}
}
void sha256(const unsigned char *message, unsigned int len, unsigned char *digest)
{
sha256_ctx ctx;
sha256_init(&ctx);
sha256_update(&ctx, message, len);
sha256_final(&ctx, digest);
}
void sha256_init(sha256_ctx *ctx)
{
#ifndef UNROLL_LOOPS
int i;
for (i = 0; i < 8; i++) {
ctx->h[i] = sha256_h0[i];
}
#else
ctx->h[0] = sha256_h0[0]; ctx->h[1] = sha256_h0[1];
ctx->h[2] = sha256_h0[2]; ctx->h[3] = sha256_h0[3];
ctx->h[4] = sha256_h0[4]; ctx->h[5] = sha256_h0[5];
ctx->h[6] = sha256_h0[6]; ctx->h[7] = sha256_h0[7];
#endif /* !UNROLL_LOOPS */
ctx->len = 0;
ctx->tot_len = 0;
}
void sha256_update(sha256_ctx *ctx, const unsigned char *message,
unsigned int len)
{
unsigned int block_nb;
unsigned int new_len, rem_len, tmp_len;
const unsigned char *shifted_message;
tmp_len = SHA256_BLOCK_SIZE - ctx->len;
rem_len = len < tmp_len ? len : tmp_len;
memcpy(&ctx->block[ctx->len], message, rem_len);
if (ctx->len + len < SHA256_BLOCK_SIZE) {
ctx->len += len;
return;
}
new_len = len - rem_len;
block_nb = new_len / SHA256_BLOCK_SIZE;
shifted_message = message + rem_len;
sha256_transf(ctx, ctx->block, 1);
sha256_transf(ctx, shifted_message, block_nb);
rem_len = new_len % SHA256_BLOCK_SIZE;
memcpy(ctx->block, &shifted_message[block_nb << 6],
rem_len);
ctx->len = rem_len;
ctx->tot_len += (block_nb + 1) << 6;
}
void sha256_final(sha256_ctx *ctx, unsigned char *digest)
{
unsigned int block_nb;
unsigned int pm_len;
unsigned int len_b;
#ifndef UNROLL_LOOPS
int i;
#endif
block_nb = (1 + ((SHA256_BLOCK_SIZE - 9)
< (ctx->len % SHA256_BLOCK_SIZE)));
len_b = (ctx->tot_len + ctx->len) << 3;
pm_len = block_nb << 6;
memset(ctx->block + ctx->len, 0, pm_len - ctx->len);
ctx->block[ctx->len] = 0x80;
UNPACK32(len_b, ctx->block + pm_len - 4);
sha256_transf(ctx, ctx->block, block_nb);
#ifndef UNROLL_LOOPS
for (i = 0 ; i < 8; i++) {
UNPACK32(ctx->h[i], &digest[i << 2]);
}
#else
UNPACK32(ctx->h[0], &digest[ 0]);
UNPACK32(ctx->h[1], &digest[ 4]);
UNPACK32(ctx->h[2], &digest[ 8]);
UNPACK32(ctx->h[3], &digest[12]);
UNPACK32(ctx->h[4], &digest[16]);
UNPACK32(ctx->h[5], &digest[20]);
UNPACK32(ctx->h[6], &digest[24]);
UNPACK32(ctx->h[7], &digest[28]);
#endif /* !UNROLL_LOOPS */
}
/* SHA-512 functions */
void sha512_transf(sha512_ctx *ctx, const unsigned char *message,
unsigned int block_nb)
{
uint64 w[80];
uint64 wv[8];
uint64 t1, t2;
const unsigned char *sub_block;
int i, j;
for (i = 0; i < (int) block_nb; i++) {
sub_block = message + (i << 7);
#ifndef UNROLL_LOOPS
for (j = 0; j < 16; j++) {
PACK64(&sub_block[j << 3], &w[j]);
}
for (j = 16; j < 80; j++) {
SHA512_SCR(j);
}
for (j = 0; j < 8; j++) {
wv[j] = ctx->h[j];
}
for (j = 0; j < 80; j++) {
t1 = wv[7] + SHA512_F2(wv[4]) + CH(wv[4], wv[5], wv[6])
+ sha512_k[j] + w[j];
t2 = SHA512_F1(wv[0]) + MAJ(wv[0], wv[1], wv[2]);
wv[7] = wv[6];
wv[6] = wv[5];
wv[5] = wv[4];
wv[4] = wv[3] + t1;
wv[3] = wv[2];
wv[2] = wv[1];
wv[1] = wv[0];
wv[0] = t1 + t2;
}
for (j = 0; j < 8; j++) {
ctx->h[j] += wv[j];
}
#else
PACK64(&sub_block[ 0], &w[ 0]); PACK64(&sub_block[ 8], &w[ 1]);
PACK64(&sub_block[ 16], &w[ 2]); PACK64(&sub_block[ 24], &w[ 3]);
PACK64(&sub_block[ 32], &w[ 4]); PACK64(&sub_block[ 40], &w[ 5]);
PACK64(&sub_block[ 48], &w[ 6]); PACK64(&sub_block[ 56], &w[ 7]);
PACK64(&sub_block[ 64], &w[ 8]); PACK64(&sub_block[ 72], &w[ 9]);
PACK64(&sub_block[ 80], &w[10]); PACK64(&sub_block[ 88], &w[11]);
PACK64(&sub_block[ 96], &w[12]); PACK64(&sub_block[104], &w[13]);
PACK64(&sub_block[112], &w[14]); PACK64(&sub_block[120], &w[15]);
SHA512_SCR(16); SHA512_SCR(17); SHA512_SCR(18); SHA512_SCR(19);
SHA512_SCR(20); SHA512_SCR(21); SHA512_SCR(22); SHA512_SCR(23);
SHA512_SCR(24); SHA512_SCR(25); SHA512_SCR(26); SHA512_SCR(27);
SHA512_SCR(28); SHA512_SCR(29); SHA512_SCR(30); SHA512_SCR(31);
SHA512_SCR(32); SHA512_SCR(33); SHA512_SCR(34); SHA512_SCR(35);
SHA512_SCR(36); SHA512_SCR(37); SHA512_SCR(38); SHA512_SCR(39);
SHA512_SCR(40); SHA512_SCR(41); SHA512_SCR(42); SHA512_SCR(43);
SHA512_SCR(44); SHA512_SCR(45); SHA512_SCR(46); SHA512_SCR(47);
SHA512_SCR(48); SHA512_SCR(49); SHA512_SCR(50); SHA512_SCR(51);
SHA512_SCR(52); SHA512_SCR(53); SHA512_SCR(54); SHA512_SCR(55);
SHA512_SCR(56); SHA512_SCR(57); SHA512_SCR(58); SHA512_SCR(59);
SHA512_SCR(60); SHA512_SCR(61); SHA512_SCR(62); SHA512_SCR(63);
SHA512_SCR(64); SHA512_SCR(65); SHA512_SCR(66); SHA512_SCR(67);
SHA512_SCR(68); SHA512_SCR(69); SHA512_SCR(70); SHA512_SCR(71);
SHA512_SCR(72); SHA512_SCR(73); SHA512_SCR(74); SHA512_SCR(75);
SHA512_SCR(76); SHA512_SCR(77); SHA512_SCR(78); SHA512_SCR(79);
wv[0] = ctx->h[0]; wv[1] = ctx->h[1];
wv[2] = ctx->h[2]; wv[3] = ctx->h[3];
wv[4] = ctx->h[4]; wv[5] = ctx->h[5];
wv[6] = ctx->h[6]; wv[7] = ctx->h[7];
j = 0;
do {
SHA512_EXP(0,1,2,3,4,5,6,7,j); j++;
SHA512_EXP(7,0,1,2,3,4,5,6,j); j++;
SHA512_EXP(6,7,0,1,2,3,4,5,j); j++;
SHA512_EXP(5,6,7,0,1,2,3,4,j); j++;
SHA512_EXP(4,5,6,7,0,1,2,3,j); j++;
SHA512_EXP(3,4,5,6,7,0,1,2,j); j++;
SHA512_EXP(2,3,4,5,6,7,0,1,j); j++;
SHA512_EXP(1,2,3,4,5,6,7,0,j); j++;
} while (j < 80);
ctx->h[0] += wv[0]; ctx->h[1] += wv[1];
ctx->h[2] += wv[2]; ctx->h[3] += wv[3];
ctx->h[4] += wv[4]; ctx->h[5] += wv[5];
ctx->h[6] += wv[6]; ctx->h[7] += wv[7];
#endif /* !UNROLL_LOOPS */
}
}
void sha512(const unsigned char *message, unsigned int len,
unsigned char *digest)
{
sha512_ctx ctx;
sha512_init(&ctx);
sha512_update(&ctx, message, len);
sha512_final(&ctx, digest);
}
void sha512_init(sha512_ctx *ctx)
{
#ifndef UNROLL_LOOPS
int i;
for (i = 0; i < 8; i++) {
ctx->h[i] = sha512_h0[i];
}
#else
ctx->h[0] = sha512_h0[0]; ctx->h[1] = sha512_h0[1];
ctx->h[2] = sha512_h0[2]; ctx->h[3] = sha512_h0[3];
ctx->h[4] = sha512_h0[4]; ctx->h[5] = sha512_h0[5];
ctx->h[6] = sha512_h0[6]; ctx->h[7] = sha512_h0[7];
#endif /* !UNROLL_LOOPS */
ctx->len = 0;
ctx->tot_len = 0;
}
void sha512_update(sha512_ctx *ctx, const unsigned char *message,
unsigned int len)
{
unsigned int block_nb;
unsigned int new_len, rem_len, tmp_len;
const unsigned char *shifted_message;
tmp_len = SHA512_BLOCK_SIZE - ctx->len;
rem_len = len < tmp_len ? len : tmp_len;
memcpy(&ctx->block[ctx->len], message, rem_len);
if (ctx->len + len < SHA512_BLOCK_SIZE) {
ctx->len += len;
return;
}
new_len = len - rem_len;
block_nb = new_len / SHA512_BLOCK_SIZE;
shifted_message = message + rem_len;
sha512_transf(ctx, ctx->block, 1);
sha512_transf(ctx, shifted_message, block_nb);
rem_len = new_len % SHA512_BLOCK_SIZE;
memcpy(ctx->block, &shifted_message[block_nb << 7],
rem_len);
ctx->len = rem_len;
ctx->tot_len += (block_nb + 1) << 7;
}
void sha512_final(sha512_ctx *ctx, unsigned char *digest)
{
unsigned int block_nb;
unsigned int pm_len;
unsigned int len_b;
#ifndef UNROLL_LOOPS
int i;
#endif
block_nb = 1 + ((SHA512_BLOCK_SIZE - 17)
< (ctx->len % SHA512_BLOCK_SIZE));
len_b = (ctx->tot_len + ctx->len) << 3;
pm_len = block_nb << 7;
memset(ctx->block + ctx->len, 0, pm_len - ctx->len);
ctx->block[ctx->len] = 0x80;
UNPACK32(len_b, ctx->block + pm_len - 4);
sha512_transf(ctx, ctx->block, block_nb);
#ifndef UNROLL_LOOPS
for (i = 0 ; i < 8; i++) {
UNPACK64(ctx->h[i], &digest[i << 3]);
}
#else
UNPACK64(ctx->h[0], &digest[ 0]);
UNPACK64(ctx->h[1], &digest[ 8]);
UNPACK64(ctx->h[2], &digest[16]);
UNPACK64(ctx->h[3], &digest[24]);
UNPACK64(ctx->h[4], &digest[32]);
UNPACK64(ctx->h[5], &digest[40]);
UNPACK64(ctx->h[6], &digest[48]);
UNPACK64(ctx->h[7], &digest[56]);
#endif /* !UNROLL_LOOPS */
}
/* SHA-384 functions */
void sha384(const unsigned char *message, unsigned int len,
unsigned char *digest)
{
sha384_ctx ctx;
sha384_init(&ctx);
sha384_update(&ctx, message, len);
sha384_final(&ctx, digest);
}
void sha384_init(sha384_ctx *ctx)
{
#ifndef UNROLL_LOOPS
int i;
for (i = 0; i < 8; i++) {
ctx->h[i] = sha384_h0[i];
}
#else
ctx->h[0] = sha384_h0[0]; ctx->h[1] = sha384_h0[1];
ctx->h[2] = sha384_h0[2]; ctx->h[3] = sha384_h0[3];
ctx->h[4] = sha384_h0[4]; ctx->h[5] = sha384_h0[5];
ctx->h[6] = sha384_h0[6]; ctx->h[7] = sha384_h0[7];
#endif /* !UNROLL_LOOPS */
ctx->len = 0;
ctx->tot_len = 0;
}
void sha384_update(sha384_ctx *ctx, const unsigned char *message,
unsigned int len)
{
unsigned int block_nb;
unsigned int new_len, rem_len, tmp_len;
const unsigned char *shifted_message;
tmp_len = SHA384_BLOCK_SIZE - ctx->len;
rem_len = len < tmp_len ? len : tmp_len;
memcpy(&ctx->block[ctx->len], message, rem_len);
if (ctx->len + len < SHA384_BLOCK_SIZE) {
ctx->len += len;
return;
}
new_len = len - rem_len;
block_nb = new_len / SHA384_BLOCK_SIZE;
shifted_message = message + rem_len;
sha512_transf(ctx, ctx->block, 1);
sha512_transf(ctx, shifted_message, block_nb);
rem_len = new_len % SHA384_BLOCK_SIZE;
memcpy(ctx->block, &shifted_message[block_nb << 7],
rem_len);
ctx->len = rem_len;
ctx->tot_len += (block_nb + 1) << 7;
}
void sha384_final(sha384_ctx *ctx, unsigned char *digest)
{
unsigned int block_nb;
unsigned int pm_len;
unsigned int len_b;
#ifndef UNROLL_LOOPS
int i;
#endif
block_nb = (1 + ((SHA384_BLOCK_SIZE - 17)
< (ctx->len % SHA384_BLOCK_SIZE)));
len_b = (ctx->tot_len + ctx->len) << 3;
pm_len = block_nb << 7;
memset(ctx->block + ctx->len, 0, pm_len - ctx->len);
ctx->block[ctx->len] = 0x80;
UNPACK32(len_b, ctx->block + pm_len - 4);
sha512_transf(ctx, ctx->block, block_nb);
#ifndef UNROLL_LOOPS
for (i = 0 ; i < 6; i++) {
UNPACK64(ctx->h[i], &digest[i << 3]);
}
#else
UNPACK64(ctx->h[0], &digest[ 0]);
UNPACK64(ctx->h[1], &digest[ 8]);
UNPACK64(ctx->h[2], &digest[16]);
UNPACK64(ctx->h[3], &digest[24]);
UNPACK64(ctx->h[4], &digest[32]);
UNPACK64(ctx->h[5], &digest[40]);
#endif /* !UNROLL_LOOPS */
}
/* SHA-224 functions */
void sha224(const unsigned char *message, unsigned int len,
unsigned char *digest)
{
sha224_ctx ctx;
sha224_init(&ctx);
sha224_update(&ctx, message, len);
sha224_final(&ctx, digest);
}
void sha224_init(sha224_ctx *ctx)
{
#ifndef UNROLL_LOOPS
int i;
for (i = 0; i < 8; i++) {
ctx->h[i] = sha224_h0[i];
}
#else
ctx->h[0] = sha224_h0[0]; ctx->h[1] = sha224_h0[1];
ctx->h[2] = sha224_h0[2]; ctx->h[3] = sha224_h0[3];
ctx->h[4] = sha224_h0[4]; ctx->h[5] = sha224_h0[5];
ctx->h[6] = sha224_h0[6]; ctx->h[7] = sha224_h0[7];
#endif /* !UNROLL_LOOPS */
ctx->len = 0;
ctx->tot_len = 0;
}
void sha224_update(sha224_ctx *ctx, const unsigned char *message,
unsigned int len)
{
unsigned int block_nb;
unsigned int new_len, rem_len, tmp_len;
const unsigned char *shifted_message;
tmp_len = SHA224_BLOCK_SIZE - ctx->len;
rem_len = len < tmp_len ? len : tmp_len;
memcpy(&ctx->block[ctx->len], message, rem_len);
if (ctx->len + len < SHA224_BLOCK_SIZE) {
ctx->len += len;
return;
}
new_len = len - rem_len;
block_nb = new_len / SHA224_BLOCK_SIZE;
shifted_message = message + rem_len;
sha256_transf(ctx, ctx->block, 1);
sha256_transf(ctx, shifted_message, block_nb);
rem_len = new_len % SHA224_BLOCK_SIZE;
memcpy(ctx->block, &shifted_message[block_nb << 6],
rem_len);
ctx->len = rem_len;
ctx->tot_len += (block_nb + 1) << 6;
}
void sha224_final(sha224_ctx *ctx, unsigned char *digest)
{
unsigned int block_nb;
unsigned int pm_len;
unsigned int len_b;
#ifndef UNROLL_LOOPS
int i;
#endif
block_nb = (1 + ((SHA224_BLOCK_SIZE - 9)
< (ctx->len % SHA224_BLOCK_SIZE)));
len_b = (ctx->tot_len + ctx->len) << 3;
pm_len = block_nb << 6;
memset(ctx->block + ctx->len, 0, pm_len - ctx->len);
ctx->block[ctx->len] = 0x80;
UNPACK32(len_b, ctx->block + pm_len - 4);
sha256_transf(ctx, ctx->block, block_nb);
#ifndef UNROLL_LOOPS
for (i = 0 ; i < 7; i++) {
UNPACK32(ctx->h[i], &digest[i << 2]);
}
#else
UNPACK32(ctx->h[0], &digest[ 0]);
UNPACK32(ctx->h[1], &digest[ 4]);
UNPACK32(ctx->h[2], &digest[ 8]);
UNPACK32(ctx->h[3], &digest[12]);
UNPACK32(ctx->h[4], &digest[16]);
UNPACK32(ctx->h[5], &digest[20]);
UNPACK32(ctx->h[6], &digest[24]);
#endif /* !UNROLL_LOOPS */
}
#ifdef TEST_VECTORS
/* FIPS 180-2 Validation tests */
#include <stdio.h>
#include <stdlib.h>
void test(const unsigned char *vector, unsigned char *digest,
unsigned int digest_size)
{
unsigned char output[2 * SHA512_DIGEST_SIZE + 1];
int i;
output[2 * digest_size] = '\0';
for (i = 0; i < (int) digest_size ; i++) {
sprintf((char *) output + 2 * i, "%02x", digest[i]);
}
printf("H: %s\n", output);
if (strcmp((char *) vector, (char *) output)) {
fprintf(stderr, "Test failed.\n");
exit(EXIT_FAILURE);
}
}
int main()
{
static const unsigned char *vectors[4][3] =
{ /* SHA-224 */
{
"23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7",
"75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525",
"20794655980c91d8bbb4c1ea97618a4bf03f42581948b2ee4ee7ad67",
},
/* SHA-256 */
{
"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad",
"248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1",
"cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0",
},
/* SHA-384 */
{
"cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed"
"8086072ba1e7cc2358baeca134c825a7",
"09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712"
"fcc7c71a557e2db966c3e9fa91746039",
"9d0e1809716474cb086e834e310a4a1ced149e9c00f248527972cec5704c2a5b"
"07b8b3dc38ecc4ebae97ddd87f3d8985",
},
/* SHA-512 */
{
"ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a"
"2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f",
"8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018"
"501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909",
"e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973eb"
"de0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b"
}
};
static const unsigned char message1[] = "abc";
static const unsigned char message2a[] = "abcdbcdecdefdefgefghfghighijhi"
"jkijkljklmklmnlmnomnopnopq";
static const unsigned char message2b[] =
"abcdefghbcdefghicdefghijdefghijkefghij"
"klfghijklmghijklmnhijklmnoijklmnopjklm"
"nopqklmnopqrlmnopqrsmnopqrstnopqrstu";
unsigned char *message3;
unsigned int message3_len = 1000000;
unsigned char digest[SHA512_DIGEST_SIZE];
message3 = malloc(message3_len);
if (message3 == NULL) {
fprintf(stderr, "Can't allocate memory\n");
return -1;
}
memset(message3, 'a', message3_len);
printf("SHA-2 FIPS 180-2 Validation tests\n\n");
printf("SHA-224 Test vectors\n");
sha224(message1, strlen((char *) message1), digest);
test(vectors[0][0], digest, SHA224_DIGEST_SIZE);
sha224(message2a, strlen((char *) message2a), digest);
test(vectors[0][1], digest, SHA224_DIGEST_SIZE);
sha224(message3, message3_len, digest);
test(vectors[0][2], digest, SHA224_DIGEST_SIZE);
printf("\n");
printf("SHA-256 Test vectors\n");
sha256(message1, strlen((char *) message1), digest);
test(vectors[1][0], digest, SHA256_DIGEST_SIZE);
sha256(message2a, strlen((char *) message2a), digest);
test(vectors[1][1], digest, SHA256_DIGEST_SIZE);
sha256(message3, message3_len, digest);
test(vectors[1][2], digest, SHA256_DIGEST_SIZE);
printf("\n");
printf("SHA-384 Test vectors\n");
sha384(message1, strlen((char *) message1), digest);
test(vectors[2][0], digest, SHA384_DIGEST_SIZE);
sha384(message2b, strlen((char *) message2b), digest);
test(vectors[2][1], digest, SHA384_DIGEST_SIZE);
sha384(message3, message3_len, digest);
test(vectors[2][2], digest, SHA384_DIGEST_SIZE);
printf("\n");
printf("SHA-512 Test vectors\n");
sha512(message1, strlen((char *) message1), digest);
test(vectors[3][0], digest, SHA512_DIGEST_SIZE);
sha512(message2b, strlen((char *) message2b), digest);
test(vectors[3][1], digest, SHA512_DIGEST_SIZE);
sha512(message3, message3_len, digest);
test(vectors[3][2], digest, SHA512_DIGEST_SIZE);
printf("\n");
printf("All tests passed.\n");
return 0;
}
#endif /* TEST_VECTORS */
+262
View File
@@ -0,0 +1,262 @@
//jagatsastry.nitk@gmail.com 9th April 09
//Implementation of SHA 512
#include<iostream>
#include<vector>
#include<fstream>
#include<string>
using namespace std;
typedef unsigned int uint;
typedef unsigned long long ullint;
string fromDecimal(ullint n, ullint b)
{
string chars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string result="";
while(n>0)
{
result=chars.at(n%b)+result;
n/=b;
}
return result;
}
ullint K[80] = {
0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,
0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,
0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,
0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,
0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,
0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,
0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,
0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,
0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,
0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,
0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,
0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,
0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,
0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL
};
void makeblock(vector<ullint>& ret, string p_msg)
{
ullint cur=0;
int ind=0;
for(uint i=0; i<p_msg.size(); i++)
{
cur = (cur<<8) | (unsigned char)p_msg[i];
if(i%8==7)
{
ret.at(ind++)=cur;
cur=0;
}
}
}
class Block
{
public:
vector<ullint> msg;
Block():msg(16, 0) { }
Block(string p_msg):msg(16, 0)
{
makeblock(msg, p_msg);
}
};
void split(vector<Block>& blks, string& msg)
{
cout<<endl<<msg.size()<<endl;;
cout<<blks.size()<<endl;
cout<<"Splitting into blocks: "<<endl;
cout<<endl<<"msgsize: "<<msg.size()*8<<endl;
for(uint i=0; i<msg.size(); i+=128)
{
makeblock(blks[i/128].msg, msg.substr(i, 128));
}
}
string mynum(ullint x)
{
string ret;
for(uint i=0; i<8; i++)
ret+=char(0);
for(uint i=8; i>=1; i--) //big endian machine assumed
{
ret += ((char*)(&x))[i-1];
}
return ret;
}
#define shr(x,n) ((x & 0xFFFFFFFFFFFFFFFFULL) >> n)
#define rotr(x,n) (shr(x,n) | (x << (64 - n)))
ullint ch(ullint x, ullint y, ullint z)
{
return (x&y) ^ (~x&z);
}
ullint maj(ullint x, ullint y, ullint z)
{
return (x&y) ^ (y&z) ^ (z&x);
}
ullint fn0(ullint x)
{
return rotr(x, 28) ^ rotr(x, 34) ^ rotr(x, 39);
}
ullint fn1(ullint x)
{
return rotr(x, 14) ^ rotr(x, 18) ^ rotr(x, 41);
}
ullint sigma0(ullint x)
{
return rotr(x, 1) ^ rotr(x, 8) ^ shr(x, 7);
}
ullint sigma1(ullint x)
{
return rotr(x, 19) ^ rotr(x, 61) ^ shr(x, 6);
}
string hash_sha512_cpp(string msg_arr)
{
cout<<char(1<<7)<<endl;
string msg_out, msg;
// cout<<"Enter message"<<endl;
// ifstream fin("input.txt");
// fin>>msg_arr;
// cin>>msg_arr;
msg=msg_arr;
msg_arr += (char)(1<<7);
uint cur_len = msg.size()*8 + 8;
uint reqd_len = ((msg.size()*8)/1024+1) *1024;
uint pad_len = reqd_len - cur_len - 128;
string pad(pad_len/8, char(0));
msg_arr += pad;
string len_str(mynum(msg.size()*8));
cout<<"mynum: "<<mynum(msg.size()*8)<<endl;
msg_arr = msg_arr + len_str;
uint num_blk = msg_arr.size()*8/1024;
vector<Block> M(num_blk, Block());
split(M, msg_arr);
ullint H[]={
0x6a09e667f3bcc908ULL,
0xbb67ae8584caa73bULL,
0x3c6ef372fe94f82bULL,
0xa54ff53a5f1d36f1ULL,
0x510e527fade682d1ULL,
0x9b05688c2b3e6c1fULL,
0x1f83d9abfb41bd6bULL,
0x5be0cd19137e2179ULL
};
for(uint i=0; i<num_blk; i++)
{
cout<<"Blk no: "<<i<<endl;
vector<ullint> W(80, 0);
for(uint t=0; t<16; t++)
{
W[t] = M[i].msg[t];
}
for(uint t=16; t<80; t++)
{
W[t] = sigma1(W[t-2]) + W[t-7] + sigma0(W[t-15]) + W[t-16];
}
ullint work[8];
for(uint i=0; i<8; i++)
work[i] = H[i];
for(uint t=0; t<80; t++)
{
ullint t1, t2;
t1 = work[7] + fn1(work[4]) + ch(work[4], work[5], work[6]) + K[t] + W[t];
t2 = fn0(work[0]) + maj(work[0], work[1], work[2]);
work[7] = work[6];
work[6] = work[5];
work[5] = work[4];
work[4] = work[3] + t1;
work[3] = work[2];
work[2] = work[1];
work[1] = work[0];
work[0] = t1 + t2;
}
for(uint i=0; i<8; i++)
{
H[i] = work[i] + H[i];
}
}
cout<<"Output: "<<endl;
cout<<"SHA 512 HASH"<<endl;
for(uint i=0; i<8; i++)
cout<<H[i]<<" ";
cout<<endl;
cout<<endl<<endl<<endl<<"****************SHA 512 MESSAGE DIGEST IN HEX****************"<<endl<<endl;
for(uint i=0; i<8; i++) {
cout<<fromDecimal(H[i], 16)<<" ";
string msg_tmp = fromDecimal(H[i], 16);
// Fix padding
while (msg_tmp.length()<16) {
msg_tmp = "0"+msg_tmp;
}
msg_out += msg_tmp;
}
cout<<endl;
// system("pause");
return msg_out;
}
+170
View File
@@ -0,0 +1,170 @@
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include "safestring.h"
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/nameser.h>
#include <resolv.h>
//#include "general_types.h"
#include "clog.h"
//#include "mx.h"
#include "smtp.h"
#include "timer.h"
//#include "socket.h"
int SMTP2( const char * _server, const char * _from, char * _to, char * _body, const char * _domain, const char * _user, const char * _pass, const char * _name)
{
// SAF 1/24/03: first copy all data to local structures to avoid race conditions, which is currently causing crashes !
// Actually, it wasn't the race condition, it was the fact that '_to' was NULL due to a bug in profile.cpp: "email" was not set
logfmt( FLOG_MAX, "ESMTP( %s, %s, %s )", _server, _from, _to );
if ( !_server || !_from || !_to || !_body )
{
logfmt( FLOG_MAX, "Input parameters server, from, to & body are requied" );
return 0;
}
if ( !_to[0])
{
logfmt( FLOG_MAX, "Empty recipient list" );
return 0;
}
int BUF_SIZE = 512+strlen(_server)+strlen(_from)+strlen(_to)+strlen(_domain)+strlen(_user)+strlen(_pass)+strlen(_name)+2*strlen(_body);
char *subject = NULL, *body = NULL;
char *name = new char[BUF_SIZE+1];
// Prepare body & subject
logfmt( FLOG_MAX, "Prepare body" );
int lines = 0;
int len = strlen( _body );
for ( int i=0; i<len; i++ )
{
int c = _body[i];
// Replace ' with "
if (c == 39)
{
_body[i] = '"';
}
// count LFs
if (c == 10)
{
lines++;
}
// remove CRs (replace with whitespaces)
if (c == 13)
{
_body[i] = 32;
}
}
// Locate & extract subject
logfmt( FLOG_MAX, "Locate & extract subject" );
char *subj = strstr ( _body, "Subject: " );
if (subj != NULL)
{
int k = 0;
int n = strlen(subj);
for (int i=0; i<n; i++)
{
int c = subj[i];
if (subject != NULL)
{
name[k++] = c;
}
if (subject == NULL && c == 10)
{
if (i > 9)
{
subject = new char[i+1];
memset( subject, 0, i );
int j = 9;
for (; j<i; j++)
{
//logfmt( FLOG_MAX, "c=%ld", subj[j] );
subject[j-9] = subj[j];
//subj[j] = 32;
}
subject[j] = '\0';
logfmt( FLOG_MAX, "Found subject: %s", subject);
}
}
}
if (subject != NULL)
{
name[k++] = '\0';
body = new char[k];
//logfmt( FLOG_MAX, "New body(%ld): %s (%ld)", k, name, strlen(_body) );
snprintf( body, k, "%s", name);
}
}
if (subject == NULL)
{
subject = new char[15];
strcpy(subject,"Wrenchboard Support");
logfmt( FLOG_MAX, "Subject is not found - defaulting to: %s", subject );
}
// Google
/*
snprintf( name, BUF_SIZE, EMAIL_PREFIX"/../src/modules/mailsend -smtp %s -f %s -t %s -d %s -name '%s' +cc +bcc -v -starttls -auth-plain -user %s -pass %s -sub '%s' -M '%s'",
_server, _from, _to, _domain, _name, _user, _pass, subject, body != NULL ? body : _body );
*//*
// Virtualmail
snprintf( name, BUF_SIZE, EMAIL_PREFIX"/../src/modules/mailsend -smtp %s -f %s -t %s -d %s -name '%s' +cc +bcc -v -port 25 -auth-plain -user %s -pass %s -sub '%s' -M '%s'",
_server, _from, _to, _domain, _name, _user, _pass, subject, body != NULL ? body : _body );
*/
// GoDaddy
snprintf( name, BUF_SIZE, EMAIL_PREFIX"/../src/modules/mailsend -smtp %s -f %s -t %s -d %s -name '%s' +cc +bcc -v -port 80 -auth-plain -user %s -pass %s -sub '%s' -M '%s'",
_server, _from, _to, _domain, _name, _user, _pass, subject, body != NULL ? body : _body );
logfmt( FLOG_MAX, "Calling MAILSEND: %s", name);
FILE * p = popen( name, "r" );
int c = 0;
do
{
c = fread( name, 1, BUF_SIZE, p );
if (c > 0)
{
logfmt( FLOG_MAX, "%s", name );
}
else
{
logfmt( FLOG_MAX, "\n\nEND OF PIPE OUTPUT\n\n" );
}
}
while (c > 0);
pclose( p );
if (name != NULL)
{
delete name;
}
if (subject != NULL)
{
delete subject;
}
if (body != NULL)
{
delete body;
}
logfmt( FLOG_MAX, "/ESMTP()" );
return 1;
}
+49
View File
@@ -0,0 +1,49 @@
#include <unistd.h>
#include <sys/time.h>
#include "timer.h"
unsigned long stamp()
{
struct timeval tv;
gettimeofday( &tv, NULL );
return tv.tv_sec * 1000000 + tv.tv_usec;
}
CTimer::CTimer( )
{
prev = stamp();
}
void CTimer::init( )
{
prev = stamp();
}
void CTimer::wake( unsigned long usec )
{
long sleep_time = usec-(stamp()-prev);
if ( sleep_time>0 )
usleep( sleep_time );
prev = stamp();
}
bool CTimer::timeout( unsigned long usec )
{
return stamp()-prev > usec;
}
unsigned long CTimer::elapsed( )
{
return stamp()-prev;
}
+135
View File
@@ -0,0 +1,135 @@
#include <stdio.h>
#include <string.h>
#include <regex.h>
#include "safestring.h"
#include "util.h"
#include "clog.h"
bool reg_match( const char * input, const char * regexp, char * ret, int sz, int * pos /*= NULL*/ )
{
regex_t compiled;
regmatch_t match[2];
bool satisfied = false;
if ( ret ) ret[0] = 0;
// logfmt( FLOG_MAX, "Matching '%s' against '%s'", input, regexp );
if ( regcomp( &compiled, regexp, REG_EXTENDED ) != 0 )
{
logfmt( logWARNING, "regcomp returned non-0, assuming a match" );
}
else
{
size_t r = regexec( &compiled, input, 2, match, 0 );
if ( r==0 ) // match
{
if ( pos )
*pos = match[1].rm_so;
int len = match[1].rm_eo-match[1].rm_so;
if ( ret )
strnsafecpy( ret, &input[ match[1].rm_so ], len, sz );
satisfied = true;
}
else
satisfied = false;
regfree( &compiled );
}
return satisfied;
}
char * urlencode( const char * buf, char * text, int sz )
{
// old char url[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ^_\\-0123456789."; // . ???
char url[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789$-_.!*'(),"; // $-_.+!*'(), took '+' out
int len = strlen(buf);
// fprintf(flog, "buf: '%s', len: %d\n", buf, len); fflush(flog);
text[0] = 0;
for (int i=0; i<len; i++)
{
int len = strlen(text);
if (strchr(url, buf[i]))
snprintf(&text[len], sz-len, "%c", buf[i]);
else
snprintf(&text[len], sz-len, "%%%02x", (unsigned char)buf[i]);
// fprintf(flog, "%d\n", i); fflush(flog);
}
// strcpy(buf, text);
// Log(text, "Returning:");
return text;
}
/*
char * urlencode(const char * buf)
{
return urlencode( buf, text, sizeof(text) );
}
*/
char * urldecode( char * buf, char * text, int sz)
{
// Log(buf, "urldecode()");
unsigned int c3;
char * c2; c2 = buf;
unsigned int ch;
char * value=text;
// int valuelen = sz;
value[0] = 0;
//bool EOS = false;
while (c2)
{
c3 = strcspn(c2, "%+"); // "%+"
if (c3==strlen(c2))
{
// strncpy_(&value[strlen(value)], c2, Min0(c3, valuelen-strlen(value)-1, EOS) );
strsafecat( value, c2, sz );
break; //over
}
// strncpy_(&value[strlen(value)], c2, Min0(c3, valuelen-strlen(value)-1, EOS) );
strnsafecat( value, c2, c3, sz );
// Log(value);
// if (EOS) break;
// '+' is actually an allowed symbol per http://www.rfc-editor.org/rfc/rfc1738.txt
// but browser rules say space is encoded as '+'
// http://www.speakeasy.org/~cgires/readdata/
if (*(c2+c3)=='+')
{
// strncpy_(&value[strlen(value)], " ", Min0(1, valuelen-strlen(value)-1, EOS) );
strsafecat( value, " ", sz );
// if (EOS) break;
c2+=c3+1;
}
else
{
sscanf(c2+c3+1, "%2x", &ch);
strcatf( value, sz, "%c", ch);
// if (strlen(value)>=valuelen-1)
// { EOS = TRUE; break; }
c2+=c3+3;
}
}
value[sz-1] = 0;
// Log(text, "urldecode returning");
return text;
}
+372
View File
@@ -0,0 +1,372 @@
#include <stdio.h>
#include <cstring>
#include <cstdlib>
#include "safestring.h"
#pragma implementation "vars.h"
#include "vars.h"
//#include <stl_hashtable.h>
//#include <stl_tree.h>
//template _Rb_tree< string const, pair<string const, varstring>, _Select1st<pair<string const, varstring> >, less<string const>, allocator<varstring> >;
//template _Rb_tree<long, pair<long const, long>, _Select1st<pair<long const, long> >, less<long>, allocator<long> >;
using namespace std;
//template class std::_Rb_tree<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, varstring>, std::_Select1st<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, varstring> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const>, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, varstring> > >;
// template class _Rb_tree<string const, pair<string const, varstring>, _Select1st<pair<basic_string<char, char_traits<char>, allocator<char> > const, varstring> >, less<basic_string<char, char_traits<char>, allocator<char> > const>, allocator<pair<basic_string<char, char_traits<char>, allocator<char> > const, varstring> > >;
template class _Rb_tree< string const, pair<string const, varstring>, _Select1st<pair<string const, varstring> >, less<string const>, allocator<pair<string const,varstring> > >;
//::operator=(std::_Rb_tree<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, varstring>, std::_Select1st<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, varstring> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const>, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, varstring> > > const&);
// default constructor
varstring::varstring() : string()
{
validated = false;
db_var = false;
binary_var = false;
}
varstring::varstring( const char *c ) : string( c )
{
this->validated = false;
db_var = false;
binary_var = false;
}
varstring::varstring(const char* c, int len) : string( c, len )
{
// logfmt( FLOG_MAX, "varstring constructor( c='%s', len=%d )", c, len );
validated = false;
db_var = false;
binary_var = false;
}
// copy constructor
varstring::varstring( const varstring &c ) : string( c )
{
// logfmt( FLOG_MAX, "varstring copy constructor, c.validated=%d, value=%s", c.validated, c.c_str() );
this->validated = c.validated;
this->db_var = c.db_var;
this->binary_var = c.binary_var;
}
varstring::varstring( const string &c ) : string( c )
{
// logfmt( FLOG_MAX, "string->varstring copy constructor, value=%s", c.c_str() );
validated = false;
db_var = false;
binary_var = false;
}
long varstring::Long() const
{
return atol( c_str() );
}
double varstring::Double()
{
return atof( c_str() );
}
varstring& varstring::operator=( const char* c )
{
set_valid( false );
string::operator=( c );
return *this;
};
void varstring::operator=( long l )
{
set_valid( false );
char s[20];
snprintf( s, sizeof(s), "%ld", l );
string::operator=( s );
};
varstring& varstring::operator=( const varstring &c )
{
//set_valid( false );
this->validated = c.validated;
this->binary_var = c.binary_var;
string::operator=( c );
return *this;
};
void varstring::operator=( const string c )
{
set_valid( false );
binary_var = false;
string::operator=( c );
}
varstring::operator long()
{
return this->Long();
}
varstring::operator const char*() // type conversion
{
return this->c_str();
}
bool varstring::valid() const
{
return validated;
}
void varstring::set_valid( bool validated /*= true*/ )
{
this->validated = validated;
}
bool varstring::db() const
{
return db_var;
}
void varstring::set_db( bool db /*= true*/ )
{
this->db_var = db;
}
bool varstring::binary() const
{
return this->binary_var;
}
void varstring::set_binary( bool binary_var /*= true*/ )
{
this->binary_var = binary_var;
}
// ---------------- string_key --------
/*
string_key& string_key::operator=( const char* c )
{
// set_valid( false );
string::operator=( c );
return *this;
};
void string_key::operator=( long l )
{
// set_valid( false );
char s[20];
snprintf( s, sizeof(s), "%ld", l );
string::operator=( s );
};
void string_key::operator=( const string c )
{
// set_valid( false );
string::operator=( c );
};
*/
// ---------------- CVars -------------
CVars& CVars::operator<<( char const *name )
{
//logfmt( FLOG_MAX, "CVars << %s", name );
CVars::iterator i = find( name );
if ( i != end() )
{
i->second.set_db();
}
return *this;
}
CVars& CVars::operator>>( char const *name )
{
//logfmt( FLOG_MAX, "CVars >> %s", name );
CVars::iterator i = find( name );
if ( i != end() )
{
i->second.set_db( false );
}
return *this;
}
void CVars::ClearDB()
{
CVars::iterator i;
for ( i=begin(); i!=end(); i++ )
i->second.set_db( false );
}
/*
FORMAT:
int count;
{
name,value,
bitmap{
bool validated;
bool db_var; // is this variable to be used in DB updates
bool binary_var;
}
*/
//implement << operator??
long CVars::serialize( unsigned char *&buf ) // this will serialize the data into buf and return the resulting size
// it is the responsibility of the caller to free the buffer with free()
{
long len;
CVars::iterator i;
int count = 0; // do NOT change this datatype as this will affect data structure below!!!
unsigned char *c = buf + sizeof(count);
// Calculate the length
for ( i=begin(); i!=end(); i++ )
{
count++;
int size = i->first.size();
c += sizeof(unsigned char); // name should be no longer than 255
c += size;
size = i->second.size();
c += sizeof(int);
c += size;
// record bits
c++;
}
len = c-buf;
buf = (unsigned char*)malloc( len );
if ( !buf ) return 0;
// Populate buf
// first store the number of elements
*(int*)buf = count;
c = buf + sizeof(count);
for ( i=begin(); i!=end(); i++ )
{
int size = *(int*)c = i->first.size();
c += sizeof(unsigned char);
memcpy( c, i->first.data(), size );
c += size;
size = *(int*)c = i->second.size();
c += sizeof(int);
memcpy( c, i->second.data(), size );
c += size;
// record bits
*c = i->second.validated | i->second.db_var << 1 | i->second.binary_var << 2;
c++;
}
return len;
}
int CVars::deserialize( unsigned char *buf, long buf_sz ) // this will initialize the current instance by de-serializing the data from buf
{
// clear out the underlying map / erase any previous data
erase( begin(), end() );
if ( buf_sz < (long)sizeof(int) ) return 0;
unsigned char *c = buf;
int count = *(int*)buf;
c += sizeof( count );
int i = 0;
for ( i=0; i<count; i++ )
{
if ( c-buf >= buf_sz ) return 0;
char name[256];
int size = *(unsigned char*)c;
c += sizeof(unsigned char);
if ( c-buf+size >= buf_sz ) break; // boundary check
strnsafecpy( name, (char*)c, size, sizeof(name) );
c += size;
if ( c-buf+(long)sizeof(int) >= buf_sz ) break; // boundary check
size = *(int*)c;
c += sizeof(int);
if ( c-buf+size+1 > buf_sz ) break; // boundary check
(*this)[name].assign( (char*)c, size );
c += size;
(*this)[name].validated = *c & 1;
(*this)[name].db_var = (*c >> 1) & 1;
(*this)[name].binary_var = (*c >> 2) & 1;
c++;
//printf( "i=%d\n", i );
}
return i; //>0 ? i-1 : 0;
}
+11
View File
@@ -0,0 +1,11 @@
#ifndef CFG_H
#define CFG_H
#include "php_jubabox_config.h"
void CfgReadConfig();
long CfgReadLong(const char* key);
//std::string CfgReadString(const char* key);
const char* CfgReadChar(const char* key);
#endif
+280
View File
@@ -0,0 +1,280 @@
#ifndef __dew_cgi_lib
#define __dew_cgi_lib
#include "php_tmpl_prefix.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <utime.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/timeb.h>
#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <ctype.h> // for tolower(char)
#include <string.h>
#include <sqltypes.h>
#include "config.h"
#include "clog.h"
#include "list.h"
#include "cvariables.h"
#define CGI_FLAG_CLEAR (char*)-1
#define EMAIL_PREFIX TMPL_PREFIX
enum { METHOD_NONE, METHOD_GET, METHOD_POST };
enum { SEQ_NONE, SEQ_REVERSE };
int Min0(int a, int b, bool & EOS); // Returns the smaller of the two; if it's < 0, returns 0
// a = how many to copy; b = limit;
void strncpy_(char * dst, char * src, int n);
int GetParam(char * params, char _name[], char value[], int valuelen, char ** end = NULL);
void CatFile( char * fname, FILE * fout );
/************************************************************************
* *
* Classes *
* *
* - Class CVariables defines a set of routines for handling internal *
* variables, which are stored by using a linked list *
* *
* - Class CGIList implements the functionality in template rendering *
* by which one can define lists of unknown length from within *
* a template. *
* *
* - Class C_CGI_Form is the most essential class for the CGI interface. *
* It enables to obtain variables passed from the browser *
* and renders complex templates using CVariables and CGIList *
* *
*************************************************************************/
// The following deals with getting variables from forms
typedef struct
{
char * mask, * explanation;
} pattern_t;
typedef
enum { CGI_STRING, CGI_RADIO,
CGI_SELECT,
CGI_SELECT_LOOKUP,
CGI_CHECKBOX,
CGI_CHECKBOXLIST, // bit-encoded ULONG
CGI_LONG,
CGI_FLOAT,
CGI_CHECKBOXLIST_ARRAY, // array of ULONGs
CGI_RADIO_INT,
CGI_SELECT_MUL, // multiple select box
CGI_RADIO_INT2, // CGI_RADIO_INT that uses first two letters of the variable name for referencing values
CGI_AMOUNT, // currency amount, converts to unsigned long
}
CGI_VAR_TYPE;
typedef struct
{
char *name;
CGI_VAR_TYPE type;
// Matching
int minlen, maxlen;
pattern_t *pattern; // ext regular expression; NULL for skip
char **radio; // for radio buttons, NULL otherwise
unsigned char nradio; // number of elements
// return portion
void *target; // Where the result should be stored
int size; // Don't exceed this !
// corresponding SQL type
int sql_type;
// more return data
bool match;
} CGI_Variable;
//
class CGIList;
typedef struct
{
char * pre, * post;
int pre_n, post_n;
} Tprepost;
class C_CGI_Form : public CVariables {
public:
friend class CGIList;
C_CGI_Form( char * _dir, char * _template_file, char * _global_template=NULL, int _argc=0, char **_argv = NULL );
// Instantiates a C_CGI_Form object.
// _dir - template directory
// _template_file - initial/default template file
// _global_template - used to encapsulate templates in a global template
// _arc - argc from main()
// _argv - argv from main()
~C_CGI_Form( );
void Email( char * fname, char * from=NULL );
bool Form( FILE * fout ); // Render output from current template into opened file 'fout'
bool Form( FILE * fout, char * template_file );
char * FormFile( char * fname ); // Render output from current template into 'fname'
char * FormBuffer( char * buf );
/* bool FormBuffer( char * buf, FILE * fout, char * listname = NULL, int listi = 0 );
// Render output from current template into buffer*/
char * RFormBuffer( char * buf, char * listname = NULL, int listi = 0 );
// Render output from current template into buffer using recursion
#ifdef WITH_LANGUAGE
char *translate( char * buf, const char *template_file );
#endif
// int GetParam( char name[], char value[], int valuelen );
// Scan 'params' for 'name' and return its value in 'value'
int GetParam( char name[], char value[], int valuelen, char ** end = NULL, char *start = NULL );
int GetParamMul( char name[], TList ** list );
int GetScreen( char * screens[], int n, const char * scrs = NULL );
// Returns current screen index as passed by the browser
// and looked up in screens[]
int GetCommand( char * commands[], int n );
// Returns current command index as passed by the browser
// and looked up in commands[]
void Template( char * _template_file )
// Sets the default template to '_template_file'
{
free( template_file );
template_file = (char*)malloc( strlen(TMPL_PREFIX)+1+strlen(_template_file)+1 );
sprintf( template_file, "%s/%s", TMPL_PREFIX, _template_file );
}
void GlobalTemplate( char * _template_file )
// Sets the global template to '_template_file'
{
if ( global_template ) free( global_template );
global_template = strdup(_template_file);
}
// void ParseGlobalTemplate(); // Parse the global template file and set 'sectionX' variables
void ParseGlobalTemplate( char * fname = NULL );
bool ParseNewTemplate( char * fname = NULL );
void MatchVariable( CGI_Variable * var, bool optional = false, bool flag_if_mismatch = true );
// Provides CGI variable mapping and matching functionality
// can match against regular expressions etc
void SetVariable( CGI_Variable * var );
// Sets a variable that may be used in a template
void Flag( CGI_Variable * var );
// Mark variable as invalid input
void Flag( char * var, char * explanation = NULL );
// Mark variable as invalid input
void ClearVariable( CGI_Variable var );
void GetNextVariable( TList * &cur, char * &c1, char * &c, char * listname, int listi );
CGIList * lists[50];
int nlists;
char * params;
char * template_file;
char * global_template;
unsigned char method, sequence;
private:
char * dir;
char * form;
#ifdef WITH_LANGUAGE
char language[10];
#endif
int argc;
char** argv;
};
class CGIList
{
public:
friend class C_CGI_Form;
CGIList( C_CGI_Form * _form, char * name );
// Instantiates a CGI_List object
// _form points to the parent form object
// name - name of the list as used in template
~CGIList() { free( listname ); if (form) form->lists[listn] = 0; };
int CloseElement() { return ++n; };
// Move on to the next element in the list.
void LetStr( char * var, char * value );
// Set a CGI list variable using the list name and element number as part of the name
void LetStrf( char * var, const char * format, ... );
void LetInt16( char * var, int value );
// Set a CGI list variable using the list name and element number as part of the name
char * GetVariable( char * var, char * result, int size );
// Obtain a CGI list variable value using the list name and element number as part of the name
void LetStr( char * var, const char * format, ... );
int n;
private:
C_CGI_Form * form;
int listn;
char * listname;
};
class CInputError : public CVariables {
public:
void Add( bool text, const char * name, const char * explanation, ... );
char * Get( const char * name, bool *text );
void Log();
};
#endif
+191
View File
@@ -0,0 +1,191 @@
#ifndef __CLOG_H__
#define __CLOG_H__
#include "php_jubabox_log.h"
#include "php_filelog_max_level.h"
#include <sstream>
#include <string>
#include <cstdio>
#include <stdarg.h>
#include <sys/types.h>
#include <unistd.h>
inline std::string NowTime();
enum TLogLevel {logERROR, logWARNING, logINFO, logDEBUG, logDEBUG1, logDEBUG2, logDEBUG3, logDEBUG4, logSQL, FLOG_MAX};
void logfmt( TLogLevel level, const char * format, ... );
template <typename T>
class Log
{
public:
Log();
virtual ~Log();
std::ostringstream& Get(TLogLevel level = logINFO);
public:
static TLogLevel& ReportingLevel();
static std::string ToString(TLogLevel level);
static TLogLevel FromString(const std::string& level);
protected:
std::ostringstream os;
private:
Log(const Log&);
Log& operator =(const Log&);
};
template <typename T>
Log<T>::Log()
{
}
template <typename T>
std::ostringstream& Log<T>::Get(TLogLevel level)
{
os << "- " << NowTime();
os << " " << ToString(level);
os << " [" << getpid() << "]: ";
os << std::string(level > logDEBUG ? level - logDEBUG : 0, '\t');
return os;
}
template <typename T>
Log<T>::~Log()
{
os << std::endl;
T::Output(os.str());
}
template <typename T>
TLogLevel& Log<T>::ReportingLevel()
{
static TLogLevel reportingLevel = FLOG_MAX;
return reportingLevel;
}
template <typename T>
std::string Log<T>::ToString(TLogLevel level)
{
static const char* const buffer[] = {"ERROR", "WARNING", "INFO", "DEBUG", "DEBUG1", "DEBUG2", "DEBUG3", "DEBUG4", "SQL", "FLOG_MAX"};
return buffer[level];
}
template <typename T>
TLogLevel Log<T>::FromString(const std::string& level)
{
if (level == "FLOG_MAX")
return FLOG_MAX;
if (level == "SQL")
return logSQL;
if (level == "DEBUG4")
return logDEBUG4;
if (level == "DEBUG3")
return logDEBUG3;
if (level == "DEBUG2")
return logDEBUG2;
if (level == "DEBUG1")
return logDEBUG1;
if (level == "DEBUG")
return logDEBUG;
if (level == "INFO")
return logINFO;
if (level == "WARNING")
return logWARNING;
if (level == "ERROR")
return logERROR;
Log<T>().Get(logWARNING) << "Unknown logging level '" << level << "'. Using INFO level as default.";
return logINFO;
}
class Output2FILE
{
public:
static FILE*& Stream();
static void Output(const std::string& msg);
};
inline FILE*& Output2FILE::Stream()
{
static FILE* pStream = stderr;
return pStream;
}
inline void Output2FILE::Output(const std::string& msg)
{
FILE* pStream = Stream();
if (!pStream)
return;
fprintf(pStream, "%s", msg.c_str());
fflush(pStream);
}
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__)
# if defined (BUILDING_FILELOG_DLL)
# define FILELOG_DECLSPEC __declspec (dllexport)
# elif defined (USING_FILELOG_DLL)
# define FILELOG_DECLSPEC __declspec (dllimport)
# else
# define FILELOG_DECLSPEC
# endif // BUILDING_DBSIMPLE_DLL
#else
# define FILELOG_DECLSPEC
#endif // _WIN32
class FILELOG_DECLSPEC FILELog : public Log<Output2FILE> {};
//typedef Log<Output2FILE> FILELog;
#ifndef FILELOG_MAX_LEVEL
#define FILELOG_MAX_LEVEL FLOG_MAX
#endif
#define FILE_LOG(level) \
if (level > FILELOG_MAX_LEVEL) ;\
else if (level > FILELog::ReportingLevel() || !Output2FILE::Stream()) ; \
else FILELog().Get(level)
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__)
#include <windows.h>
inline std::string NowTime()
{
const int MAX_LEN = 200;
char buffer[MAX_LEN];
if (GetTimeFormatA(LOCALE_USER_DEFAULT, 0, 0,
"HH':'mm':'ss", buffer, MAX_LEN) == 0)
return "Error in NowTime()";
char result[100] = {0};
static DWORD first = GetTickCount();
std::sprintf(result, "%s.%03ld", buffer, (long)(GetTickCount() - first) % 1000);
return result;
}
#else
#include <sys/time.h>
inline std::string NowTime()
{
char buffer[11];
time_t t;
time(&t);
tm r = {0};
strftime(buffer, sizeof(buffer), "%X", localtime_r(&t, &r));
struct timeval tv;
gettimeofday(&tv, 0);
char result[100] = {0};
std::sprintf(result, "%s.%03ld", buffer, (long)tv.tv_usec / 1000);
return result;
}
#endif //WIN32
#endif //__LOG_H__
/*
vi:ts=2
*/
+59
View File
@@ -0,0 +1,59 @@
/* config.h. Generated from config.h.in by configure. */
/* config.h.in. Generated from configure.in by autoheader. */
/* Whether to build jubabox_api as dynamic module */
#define COMPILE_DL_JUBABOX_API 1
/* Define to 1 if you have the <dlfcn.h> header file. */
#define HAVE_DLFCN_H 1
/* Define to 1 if you have the <inttypes.h> header file. */
#define HAVE_INTTYPES_H 1
/* Define to 1 if you have the <memory.h> header file. */
#define HAVE_MEMORY_H 1
/* Define to 1 if you have the <stdint.h> header file. */
#define HAVE_STDINT_H 1
/* Define to 1 if you have the <stdlib.h> header file. */
#define HAVE_STDLIB_H 1
/* Define to 1 if you have the <strings.h> header file. */
#define HAVE_STRINGS_H 1
/* Define to 1 if you have the <string.h> header file. */
#define HAVE_STRING_H 1
/* Define to 1 if you have the <sys/stat.h> header file. */
#define HAVE_SYS_STAT_H 1
/* Define to 1 if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1
/* Define to 1 if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
/* Define to 1 if your C compiler doesn't accept -c and -o together. */
/* #undef NO_MINUS_C_MINUS_O */
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT ""
/* Define to the full name of this package. */
#define PACKAGE_NAME ""
/* Define to the full name and version of this package. */
#define PACKAGE_STRING ""
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME ""
/* Define to the home page for this package. */
#define PACKAGE_URL ""
/* Define to the version of this package. */
#define PACKAGE_VERSION ""
/* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1
+10
View File
@@ -0,0 +1,10 @@
#ifndef __mx_creditcards_h__
#define __mx_creditcards_h__
#include "vars.h"
long save_creditcard(CVars in, CVars &out);
#endif
+61
View File
@@ -0,0 +1,61 @@
#ifndef __cvariables__
#define __cvariables__
#include "stdarg.h"
#include <stdio.h>
#define MAX_CGI_VAR_LEN 50
typedef struct _L_Variables
{
char name[MAX_CGI_VAR_LEN+1];
char * value;
int opts; // options? used by some decendants
struct _L_Variables * next;
} L_Variables;
class CVariables
{
public:
friend class CGIList;
CVariables( );
~CVariables( );
void RenameVariable( const char * name, const char * newname );
void LetInt16( char * var, const int value ); // Set the variable to an integer value
void LetStr( const char * var, const char * value ); // Set the variable to a string value
void LetStrf( char * var, const char * format, ... );
void vLetStrf( char * var, const char * format, va_list ap );
void LetStr( char * var, const char * value, int len );
// Set the variable to a string value and truncate to len
void StrCat( char * var, const char * format, ... );
void StrCatf( char * var, const char * format, ... );
char * GetVariable( const char * var ); // Obtain the variable value and return its temp location
char * GetVariable( const char * var, char * result, int size );
// Obtain the variable value and return it in 'result'
char * GetVariable( const char * var, bool test, char * section = "" );
long GetVariableLong( char * name, bool *valid = NULL );
long GetVariableLong( char * name, bool test, char * section = "" );
bool GetBool( char * var, bool test = false, char * section = "" );
void PrintVars( FILE * f = stdout ); // Print out all variables to file pointed to by 'f'
void Cleanup();
L_Variables * var, * var_top;
L_Variables * FindVariable( const char * var, bool create=false );
// Obtains the next variable during the template parsing process
};
#endif
+20
View File
@@ -0,0 +1,20 @@
#ifndef __EXCEPTIONS_H__
#define __EXCEPTIONS_H__
#include "vars.h"
class bad_parameter{
public:
bad_parameter( CVars &out, const char *name );
};
class err : public std::exception
{
public:
err( char *msg );
};
#endif
+26
View File
@@ -0,0 +1,26 @@
#ifndef __mx_function_agents_h__
#define __mx_function_agents_h__
#include "vars.h"
long medTrDeviceList(CVars in, CVars &out);
long medTrCreateAgent(CVars in, CVars &out);
long TranspLoginAdmin(CVars in, CVars &out);
long TransporterSessionCheck(long uid, const char *sessionid, int create);
long medTrTransporterTransportList(CVars in, CVars &out);
long medTrLoadIntepreter(CVars in, CVars &out);
long medTrCreateIntepreter(CVars in, CVars &out);
long medTrCreateTransporter(CVars in, CVars &out);
long medTrTransporterLocationtList(CVars in, CVars &out);
long medTrTransporterTranslatortList(CVars in, CVars &out);
long medTrUpdateItepreter(CVars in, CVars &out);
long medTrLoadTransporter(CVars in, CVars &out);
long medTrUpdateTransporter(CVars in, CVars &out);
long medTrInterpreterLanguage(CVars in, CVars &out);
long medTrInterpreterLangList(CVars in, CVars &out);
void GenerateAgentFolder(unsigned long agent_id, char * number, int sz);
long medTrAgentLangList(CVars in, CVars &out);
long medAssignTranspoter(CVars in, CVars &out);
#endif
+11
View File
@@ -0,0 +1,11 @@
#ifndef __mx_function_backoffice_h__
#define __mx_function_backoffice_h__
#include "vars.h"
long LoginBkoAdmin(CVars in, CVars &out);
long createBkoAdmin(CVars in, CVars &out);
#endif
+8
View File
@@ -0,0 +1,8 @@
#ifndef __mx_function_cron_h__
#define __mx_function_cron_h__
#include "vars.h"
#endif
+13
View File
@@ -0,0 +1,13 @@
#ifndef __mx_function_driver_h__
#define __mx_function_driver_h__
#include "vars.h"
long medTrDriverFunctions(CVars in, CVars &out);
long medTrCreateDriver(CVars in, CVars &out);
long medTrDriverList(CVars in, CVars &out);
long medTrDriverUpdate(CVars in, CVars &out);
long medTrLoadDriver(CVars in, CVars &out);
#endif
+16
View File
@@ -0,0 +1,16 @@
#ifndef __mx_function_invoice_h__
#define __mx_function_invoice_h__
#include "vars.h"
long medTrInvoiceFunctions(CVars in, CVars &out);
long medTrGetTransportInvoice(CVars in, CVars &out);
long medTrGetMemberInvoice(CVars in, CVars &out);
long getMemberInvoiceID( long transport_id );
long medTrInvoice(CVars in, CVars &out);
long medTSendInvoice(CVars in, CVars &out);
#endif
+18
View File
@@ -0,0 +1,18 @@
#ifndef __mx_function_members_h__
#define __mx_function_members_h__
#include "vars.h"
long DeletAallCards(CVars in, CVars &out);
long medTMemberLogin(CVars in, CVars &out);
long medTrCreateMember(CVars in, CVars &out);
long medTrUpdateProfile(CVars in, CVars &out);
long kleenNewLundryPickUp(CVars in, CVars &out);
//long SessionCheck(long uid, const char *sessionid, int create );
long medTrUpdateStartProfile(CVars in, CVars &out);
long getServiceDetail(long service_id, CVars &out);
long medTrMemberTransportList(CVars in, CVars &out);
long medTrMemberTransportById(CVars in, CVars &out);
long medTrLanguageList(CVars in, CVars &out);
long medTrMemberServiceById(CVars in, CVars &out);
#endif
+20
View File
@@ -0,0 +1,20 @@
#ifndef __mx_function_users_h__
#define __mx_function_users_h__
#include "vars.h"
long savvyMemberLogin(CVars in, CVars &out);
long passwordReset(CVars in, CVars &out);
long startPassReset(CVars in, CVars &out);
long confirmPassReset(CVars in, CVars &out);
long completePassReset(CVars in, CVars &out);
long userDeleteCard(CVars in, CVars &out);
long kleenDryCleanList(CVars in, CVars &out);
long getUserCCList(CVars in, CVars &out);
long manageUserCCList(CVars in, CVars &out);
#endif
+140
View File
@@ -0,0 +1,140 @@
/*-
* HMAC-SHA-224/256/384/512 implementation
* Last update: 06/15/2005
* Issue date: 06/15/2005
*
* Copyright (C) 2005 Olivier Gay <olivier.gay@a3.epfl.ch>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the project nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#ifndef _HMAC_SHA2_H
#define _HMAC_SHA2_H
#include "sha2.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
sha224_ctx ctx_inside;
sha224_ctx ctx_outside;
/* for hmac_reinit */
sha224_ctx ctx_inside_reinit;
sha224_ctx ctx_outside_reinit;
unsigned char block_ipad[SHA224_BLOCK_SIZE];
unsigned char block_opad[SHA224_BLOCK_SIZE];
} hmac_sha224_ctx;
typedef struct {
sha256_ctx ctx_inside;
sha256_ctx ctx_outside;
/* for hmac_reinit */
sha256_ctx ctx_inside_reinit;
sha256_ctx ctx_outside_reinit;
unsigned char block_ipad[SHA256_BLOCK_SIZE];
unsigned char block_opad[SHA256_BLOCK_SIZE];
} hmac_sha256_ctx;
typedef struct {
sha384_ctx ctx_inside;
sha384_ctx ctx_outside;
/* for hmac_reinit */
sha384_ctx ctx_inside_reinit;
sha384_ctx ctx_outside_reinit;
unsigned char block_ipad[SHA384_BLOCK_SIZE];
unsigned char block_opad[SHA384_BLOCK_SIZE];
} hmac_sha384_ctx;
typedef struct {
sha512_ctx ctx_inside;
sha512_ctx ctx_outside;
/* for hmac_reinit */
sha512_ctx ctx_inside_reinit;
sha512_ctx ctx_outside_reinit;
unsigned char block_ipad[SHA512_BLOCK_SIZE];
unsigned char block_opad[SHA512_BLOCK_SIZE];
} hmac_sha512_ctx;
void hmac_sha224_init(hmac_sha224_ctx *ctx, unsigned char *key,
unsigned int key_size);
void hmac_sha224_reinit(hmac_sha224_ctx *ctx);
void hmac_sha224_update(hmac_sha224_ctx *ctx, unsigned char *message,
unsigned int message_len);
void hmac_sha224_final(hmac_sha224_ctx *ctx, unsigned char *mac,
unsigned int mac_size);
void hmac_sha224(unsigned char *key, unsigned int key_size,
unsigned char *message, unsigned int message_len,
unsigned char *mac, unsigned mac_size);
void hmac_sha256_init(hmac_sha256_ctx *ctx, unsigned char *key,
unsigned int key_size);
void hmac_sha256_reinit(hmac_sha256_ctx *ctx);
void hmac_sha256_update(hmac_sha256_ctx *ctx, unsigned char *message,
unsigned int message_len);
void hmac_sha256_final(hmac_sha256_ctx *ctx, unsigned char *mac,
unsigned int mac_size);
void hmac_sha256(unsigned char *key, unsigned int key_size,
unsigned char *message, unsigned int message_len,
unsigned char *mac, unsigned mac_size);
void hmac_sha384_init(hmac_sha384_ctx *ctx, unsigned char *key,
unsigned int key_size);
void hmac_sha384_reinit(hmac_sha384_ctx *ctx);
void hmac_sha384_update(hmac_sha384_ctx *ctx, unsigned char *message,
unsigned int message_len);
void hmac_sha384_final(hmac_sha384_ctx *ctx, unsigned char *mac,
unsigned int mac_size);
void hmac_sha384(unsigned char *key, unsigned int key_size,
unsigned char *message, unsigned int message_len,
unsigned char *mac, unsigned mac_size);
void hmac_sha512_init(hmac_sha512_ctx *ctx, unsigned char *key,
unsigned int key_size);
void hmac_sha512_reinit(hmac_sha512_ctx *ctx);
void hmac_sha512_update(hmac_sha512_ctx *ctx, unsigned char *message,
unsigned int message_len);
void hmac_sha512_final(hmac_sha512_ctx *ctx, unsigned char *mac,
unsigned int mac_size);
void hmac_sha512(unsigned char *key, unsigned int key_size,
unsigned char *message, unsigned int message_len,
unsigned char *mac, unsigned mac_size);
#ifdef __cplusplus
}
#endif
#endif /* ! _HMAC_SHA2_H */
+15
View File
@@ -0,0 +1,15 @@
#ifndef __INPUT_H__
#define __INPUT_H__
#include "vars.h"
#include "exceptions.h"
void REQ_STRING( CVars &in, const char * name, int min_len, int max_len, const char *regex ) throw (bad_parameter);
long REQ_LONG( CVars &in, const char *name, long min, long max );
bool OptionalSpecified( CVars &in, const char * name );
#define OPTIONAL(mapname, var) \
if ( OptionalSpecified(mapname,var) )
#endif
+20
View File
@@ -0,0 +1,20 @@
#ifndef JUBABOX_API_JUBABOX_H
#define JUBABOX_API_JUBABOX_H
#include "vars.h"
// A very simple jubabox class
class JubaBox {
public:
JubaBox();
~JubaBox();
long jubabox_api(CVars in, CVars &out);
const char* cfgReadChar(const char *parameter);
long cfgReadLong(const char *parameter);
void logMessage(const char *message);
private:
FILE* pFile;
int db;
};
#endif /* JUBABOX_API_JUBABOX_H */
+509
View File
@@ -0,0 +1,509 @@
#ifndef JUBABOX_API_H
#define JUBABOX_API_H
enum {
DIR_TARGET, DIR_SOURCE};
enum {
FLAG_INIT, FLAG_START, FLAG_CANCEL, FLAG_FAIL, FLAG_OK
};
enum {
WHAT_NEW_CARDADD, WHAT_PICKUP_INITIALPAYMENT
};
enum {
PARTNER_STRIPE
};
#define PHP_API_OK 0
#define PHP_CREATED_OK 10
#define PHP_LOGIN_OK 100
#define PHP_API_BAD_PARAM -1
#define PHP_VALID_SESSION 505
#define PHP_INVALID_SESSION 777
#define MODE_ADD 100
#define MODE_UPDATE 200
#define MODE_DELETE 300
#define MODE_LIST 400
#define NEW_CARD 0
#define EXISTING_CARD 1
#define ACH1 2
#define ACH2 3
#define BALANCE 4
#define INSURANCE 5
#define INVOICED 6
#define INVOICE_PREVIEW 100
#define INVOICE_FINAL 200
#define TRNASPORTER 1
#define TRANSLATOR 2
#define MODE_CONFIRM_ASSIGNMENT 100
#define MODE_REJECT_ASSIGNMENT 200
#define MODE_CANCEL_ASSIGNMENT 210
#define MODE_ACTIVATE_ASSIGNMENT 300
#define MODE_COMPLETE_ASSIGNMENT 400
#define SAVVY_USER_MOBILESTART 20000
#define SAVVY_USER_CREATEACCOUNT 22010
#define SAVVY_USER_LOGINACCOUNT 22015
#define SAVVY_USER_TRACKLOCATION 22020
#define SAVVY_USER_SAVECARDPAYMT 22025
#define SAVVY_USER_GETCARDPMYLIST 22030
#define SAVVY_USER_MANAGEPAYLIST 22035
#define SAVVY_USER_LOADUSERPROFILE 22040
#define SAVVY_USER_UPDATEUSERPROFILE 22045
#define SAVVY_USER_VERIFYSESSION 22999
#define SAVVY_USER_MOBILEEND 29999
#define MODE_RELEASE_DRIVER_ASSIGNMENT 705
#define MEDTRANS_STRIPE_CHARGE_ONE 90004
#define MEDTRANS_STRIPE_CHARGE_NEW 90005
#define MEDTRANS_EMAIL_TEST 90006
#define MEDTRANS_PROCESS_PAYMENT 90011
#define MEDTRANS_UPLOADS 4505
#define MEDTRANS_DOWNLOAD 4506
// MEDTRANS BACK OFFICE FUNCTION*****************
#define MEDTRANS_BKO_START 100000
#define MEDTRANS_BKO_LOGIN 100005
#define MEDTRANS_BKO_CREATEUSER 100010
#define MEDTRANS_BKO_EDITUSER 100011
#define MEDTRANS_BKO_UPDATEMEMBER 100012
#define MEDTRANS_BKO_ADDREASON 100020
#define JUBABOX_BKO_DELETEALLCARDS 100022
#define JUBABOX_BKO_ADDCARD 100028
#define MEDTRANS_BKO_LANGUAGE_STATUS 100030
#define MEDTRANS_BKO_CONFIG_USER_TRANSPORT_PRICING 100100
#define MEDTRANS_BKO_CONFIG_USER_TRANSLATOR_PRICING 100101
#define MEDTRANS_BKO_CONFIG_USER_CONCIERGE_PRICING 100102
#define MEDTRANS_BKO_CONFIG_AGENT_TRANSPORT_PRICING 100103
#define MEDTRANS_BKO_CONFIG_AGENT_TRANSLATOR_PRICING 100104
#define MEDTRANS_BKO_CONFIG_AGENT_CONCIERGE_PRICING 100105
#define MEDTRANS_BKO_END 199999
// MEDTRANS USER FUNCTIONS***********************
#define MEDTRANS_USER_START 200000
#define JUBABOX_USER_DRYCLIST 200002
#define MEDTRANS_USER_LOGIN 200005 // LOGIN USER
#define MEDTRANS_USER_VERIFYSESSION 200007 // VERIFY SESSION
#define MEDTRANS_USER_CREATE 200010 // CREATE NEW USER
#define JUBABOX_USER_COMPLETEPROFILE 200013 // Required profile update
#define MEDTRANS_USER_UPDATE 200015 // UPDATING USER PROFILE
#define MEDTRANS_USER_PROFILE 200020 // THIS CREATES THE ADDRESS ENTRY
#define JUBABOX_USER_SAVECARDPAYMENT 200021
#define JUBABOX_USER_GETCCLIST 200022
#define MEDTRANS_USER_NEWLUNDRYPICK 200025 // REQUEST TRANSPORT
#define MEDTRANS_USER_GET_TRAN_BYID 200030 // REQUEST TRANSPORT BY ID
#define JUBABOX_USER_GETSERVICELIST 200035 // REQUEST TRANSPORT LIST
#define MEDTRANS_USER_LUNDRYLOCATION 200040
#define MEDTRANS_USER_GET_TRANSLLIST 200045 // REQUEST TRANSLATION LIST
#define MEDTRANS_USER_SENDINVOICE 200059
#define MEDTRANS_USER_GET_INVOICE 200060
#define MEDTRANS_USER_GETINVOICE 200063
#define JUBABOX_USER_CONFIRMPICKUP 200064
#define JUBABOX_USER_GETSERVICEITEM 200065
#define MEDTRANS_USER_GETCCLIST 200066
//#define MEDTRANS_USER_START_PASSRESET 200067
//#define MEDTRANS_USER_CONFIRM_RESET 200068
//#define MEDTRANS_USER_COMPLETE_PASSRESET 200069
#define MEDTRANS_USER_PASSRESET 200067
#define JUBABOX_USER_DELETECARD 200075
#define RESET_START 100
#define RESET_CONFIRM 200
#define RESET_COMPLETE 300
#define MEDTRANS_USER_END 299999
// MEDTRANS INTERPRETERS ***************************
#define MEDTRANS_INTERP_START 300000
#define MEDTRANS_INTERP_END 399999
// MEDTRANS TRANLATORS ***************************
#define MEDTRANS_TRANSP_START 400000
#define MEDTRANS_TRANSP_LOGIN 400005
#define MEDTRANS_LOAD_AGENT 400006
#define MEDTRANS_TRANSP_VERIFYSESSION 400007
#define MEDTRANS_TRANSP_CREATE 400010
#define MEDTRANS_TRANSP_ADDLOCATION 400020
#define MEDTRANS_TRANSP_LISTLOCATION 400021
#define MEDTRANS_TRANSP_EDITLOCATION 400022
#define MEDTRANS_TRANSP_AGENTPROFILE 400024
#define MEDTRANS_TRANSP_ADDDEVICE 400030
#define MEDTRANS_TRANSP_GET_TRANSLIST 400040
#define MEDTRANS_TRANSP_GET_TRANSPORTER 400041
#define MEDTRANS_TRANSP_SET_TRANSSTATUS 400042
#define MEDTRANS_TRANSP_GETREASON 400043
#define MEDTRANS_TRANSP_GET_TRANSLATOR 400044
#define MEDTRANS_TRANSP_ADD_TRANSLATOR 400045
#define MEDTRANS_TRANSP_LIST_TRANSLATOR 400046
#define MEDTRANS_TRANSP_EDIT_TRANSLATOR 400047
#define MEDTRANS_TRANSP_MANAGELANGUAGE 400049
#define MEDTRANS_TRANSP_LANGUAGELIST 400050
#define MEDTRANS_TRANSP_AGENTLANGUAGE 400051 // LANGUAGE SUPPORTED BY AGENT
#define MEDTRANS_TRANSP_GET_TRANSLATORLIST 400052
#define MEDTRANS_TRANSL_SET_TRANSSTATUS 400055
#define MEDTRANS_TRANSP_DRIVERSCALL 400060
#define MEDTRANS_TRANSP_GETINVOICE 400070
#define MEDTRANS_TRANSP_DEVICELIST 405000
#define TRANSPORT_ASSIGN 100
#define TRANSLATE_ASSIGN 200
#define PENDING 0
#define CONFIRMED 2
#define CANCELLED 3
#define ASSIGNED 4
#define INPROGRESS 7 // 8,9
#define COMPLETED 5
#define SETTLED 9
#define MEDTRANS_TRANSP_ASSIGNTRANSPORT 400080
#define MEDTRANS_TRANSP_ASSIGNTRANSLATOR 400085
#define MEDTRANS_TRANSP_CANCELTRANSLATION 470000
#define MEDTRANS_TRANSL_ASSIGNFAIL 490001
#define MEDTRANS_TRANSP_END 499999
//***********************************************
#define MEDTRANS_PROVIDER_START 500000
#define MEDTRANS_PROVIDER_CREATE 500010
#define MEDTRANS_PROVIDER_LOGIN 500020
#define MEDTRANS_PROVIDER_VERIFYSESSION 500021
#define MEDTRANS_PROVIDER_PROVISION 500022
#define MEDTRANS_PROVIDER_SETSTATUS 500023
#define MEDTRANS_PROVIDER_RESETPASS 500025
#define MEDTRANS_PROVIDER_PROFILE 500027
#define MEDTRANS_PROVIDER_UPDATEPROFILE 500028
#define MEDTRANS_PROVIDER_TANSPORTLIST 500060
#define MEDTRANS_PROVIDER_TRANSLATEIST 500065
#define MEDTRANS_PROVIDER_END 599999
//status options
#define PROVIDER_DECLINE 3
#define PROVIDER_CONFIRM 4
#define PROVIDER_COMPLETED 5
#define PROVIDER_STARTED 6
// MEDTRANS CRONS ***************************
#define MEDTRANS_CRON_START 900000
#define CRON_USER_REMINDER 900001
#define CRON_TRANSPORTER_REMINDER 900002
#define CRON_INTERPRETER_REMINDER 900003
#define CRON_PROCESS_DISTANCE 900501
#define CRON_PROCESS_AUTOASSIGN 900510
#define MEDTRANS_CRON_END 999999
#define PAYMENT_MODE 100
#define REFUND_MODE 333
#define OFFER_ACCEPT 100
#define OFFER_REJECT 333
#define OFFER_CANCEL 222
#define CONTRACT_NOTIFY_COMPLETE 4
#define CONTRACT_REQUEST_CANCEL 3
#define CONTRACT_ACCEPT_COMPLETE 5
#define CONTRACT_REJECT_COMPLETE 1
#define SM_PENDING 1
#define SM_CANCEL 3
#define SM_FAILED 4
#define SM_COMPLETED 5
// define email series here
#define ACCOUNT_CREATED_MAIL 100
#define ACCOUNT_CREATED_ALERT 101
#define ACCOUNT_CONTACT_MAIL 102
#define ACCOUNT_CONTACT_ALERT 103
#define ACCOUNT_PASSWORD_RESET 104
#define ACCOUNT_LOGIN_ALERT 105
#define ACCOUNT_RESEND_PENDING 106
#define ACCOUNT_SENDMONEY_ALERT 120
#define ACCOUNT_START_SENDMONEY 121
#define ACCOUNT_COMPLETE_SENDMONEY 122
#define JOBS_CREATED_MAIL 200
#define JOBS_INDIVIDUAL_OFFER_MAIL 201
#define JOBS_GROUP_OFFER_MAIL 202
#define JOBS_MESSAGE_ADDED 203
#define JOBS_OFFER_ACCEPT_MAIL 207
#define JOBS_OFFER_REJECT_MAIL 208
#define JOBS_OFFER_CANCEL_MAIL 209
//#define JOBS_CREATED_MAIL 202
//#define JOBS_CREATED_MAIL 203
#define PROJ_CREATED_MAIL 300
//#define PROJ_CREATED_MAIL 301
//#define PROJ_CREATED_MAIL 302
//#define PROJ_CREATED_MAIL 303
//========================
#define JUBABOX_SESSION_CHECK 299
#define JUBABOX_USER_LOGIN 300
#define JUBABOX_USER_LOGOUT 301
#define JUBABOX_CREATE_ACCOUNT 320
//**************************************************************
#define JUBABOX_BKO_START 10000
#define JUBABOX_BKO_LOGIN 10010
#define JUBABOX_BKO_CREATEUSER 10015
#define JUBABOX_BKO_UPDATEUSER 10020
#define JUBABOX_BKO_MEMBERADD 100025
#define JUBABOX_BKO_MEMBERUPDT 100026
#define JUBABOX_BKO_END 10999
//**************************************************************
#define JUBABOX_ACCOUNT_START 11000
#define JUBABOX_ACCOUNT_TESTEMAIL 11001
#define JUBABOX_ACCOUNT_PENDING 11010
#define JUBABOX_VERIFY_PENDING_LINK 11015
#define JUBABOX_ACCOUNT_RESETPASS 11016
#define JUBABOX_DELETE_PENDING_LINK 11018
#define JUBABOX_RESEND_PENDING_LINK 11019
#define JUBABOX_ACCOUNT_CREATEACC 11020
#define JUBABOX_ACCOUNT_LOGIN 11025
#define JUBABOX_FACEBOOK_LOGIN 11026
#define JUBABOX_SEND_CONTACTUS 11030
#define JUBABOX_LOG_MEMBER 11040
#define JUBABOX_ACCOUNT_END 11999
//**************************************************************
#define JUBABOX_GROUP_START 12000
#define JUBABOX_GROUP_CREATEGROUP 12010
#define JUBABOX_GROUP_INVITEGROUP 12015
#define JUBABOX_GROUP_ACCEPTGROUP 12020
#define JUBABOX_GROUP_END 12999
//**************************************************************
#define JUBABOX_JOBS_START 13000
#define JUBABOX_JOB_CREATEJOB 13010
#define JUBABOX_JOB_GROUP_MEMBER 13015
#define JUBABOX_JOB_DELETE_GROUPMEMBER 13017
#define JUBABOX_JOB_CREATE_GROUP 13020
#define JUBABOX_JOB_DELETE_GROUP 13023
#define JUBABOX_JOB_OFFER_INDVI 13030
#define JUBABOX_JOB_OFFER_GROUP 13031
#define JUBABOX_JOB_OFFER_CONCLUDE 13035
#define JUBABOX_JOBS_END 13999
//**************************************************************
#define JUBABOX_CONTRACT_START 14000
#define JUBABOX_CONTRACT_MESSAGE 14010
#define JUBABOX_CONTRACT_STATUS 14015
#define JUBABOX_CONTRACT_END 14999
//**************************************************************
#define JUBABOX_SMONEY_START 33000
#define JUBABOX_SMONEY_ADDRECIPIENT 33010
#define JUBABOX_SMONEY_MEMBER 33020
#define JUBABOX_SMONEY_PROCFEE 33025
#define JUBABOX_SMONEY_END 33999
//**************************************************************
#define JUBABOX_LOGIN_SHOP 50501
#define JUBABOX_LOGIN_ADMIN 50502
#define JUBABOX_LOGIN_MANAGER 50503
#define JUBABOX_SURVEY_DATA 55000
#define JUBABOX_ADD_SURVEY 55050
#define JUBABOX_LOAD_SURVEY 55055
#define JUBABOX_COMPLETE_SENDMONEY_INTERSW 555
#define JUBABOX_GETBILLER_INTERSW 556
#define JUBABOX_BILL_PAYMENT_ADVICE_INTERSW 557
#define JUBABOX_INTERSW_GETBILLER 556
#define JUBABOX_INTERSW_BILL_PAYMENT_ADVICE 557
#define JUBABOX_INTERSW_GETBILLERPAYMENTINTEMS 558
#define JUBABOX_INTERSW_GETBILLERCATEGORIES 559
#define JUBABOX_INTERSW_DO_TRANSFER 560
#define JUBABOX_INTERSW_QUERY_TRANSACTION 561
#define JUBABOX_ADD_MONEYRECIPIENT 600
#define JUBABOX_CREATE_USER_ACCOUNT 700
#define JUBABOX_USER_ACCOUNT_LOGIN 710
#define JUBABOX_START_PASSWORDRESET 720
#define JUBABOX_COMPLETE_PASSWORDRESET 730
#define JUBABOX_START_ADDMONEY 770
#define JUBABOX_COMPLETE_ADDMONEY 775
#define JUBABOX_ADD_MOBILE_TOPUPNUM 900
#define JUBABOX_PROMO_CALL 990
#define JUBABOX_STOREFACE_GET_ACCOUNT_BALANCE 891
#define JUBABOX_LOG_ENTRY 900000
#define JUBABOX_CREDIT_TOPUP 900010
#define JUBABOX_TOPUP_ORDER 900020
#define JUBABOX_TOPUP_ORDER_PURCHASE 900030
#define JUBABOX_PAYPAL_IPNMSG 900090
#define JUBABOX_BULKTOPUP_ORDER 700010
#define JUBABOX_BULKTOPUP_ITEM 700020
#define JUBABOX_BULKTOPUP_ITEMUPDATE 700030
#define JUBABOX_BULKTOPUP_DELIVER 700040
#define JUBABOX_BALANCE_TOPUP_ORDER 800020
#define JUBABOX_BALANCE_TOPUP_PURCHASE 800030
#define JUBABOX_BALANCE_TOPUP_PAYMENT 800040
#define VIRTUAL_AIRTOPUP 70011
#define PAY_MODE_BALANCE 0
#define PAY_MODE_CCARD 1
#define PAY_MODE_BONUS 9
#define APPROVED_BALANCE 5
#define DISAPROVE_BALANCE 3
#endif
+8
View File
@@ -0,0 +1,8 @@
#ifndef JUBABOX_API_MAIN_H
#define JUBABOX_API_MAIN_H
#include "vars.h"
long jubabox_api_main(CVars in, CVars &out);
#endif
+21
View File
@@ -0,0 +1,21 @@
#ifndef __storeface_list_h__
#define __storeface_list_h__
typedef struct _list
{
char * text;
struct _list * next;
} TList;
void DestroyList( TList * top );
TList * Add( TList * list, char * text, long size );
TList * AddF( TList * list, char * format, ... );
#endif
+15
View File
@@ -0,0 +1,15 @@
#ifndef __mx_medTEmails_h__
#define __mx_medTEmails_h__
#include "vars.h"
long member_email_calls(long action, CVars in, CVars &out);
long transporter_email_calls(long action, CVars in, CVars &out);
long agent_email_calls(long action, CVars in, CVars &out);
long cron_email_calls(long action, CVars in, CVars &out);
long alert_email_calls(long action, CVars in, CVars &out);
long email_test(CVars in, CVars &out);
long provider_email_calls(long action, CVars in, CVars &out);
#endif
+10
View File
@@ -0,0 +1,10 @@
#ifndef __mx_medTUpload_h__
#define __mx_medTUpload_h__
#include "vars.h"
long medtrans_upload(CVars in, CVars &out);
long medtrans_download(CVars in, CVars &out);
#endif
+10
View File
@@ -0,0 +1,10 @@
#ifndef __mx_medTrBackOffice_h__
#define __mx_medTrBackOffice_h__
#include "vars.h"
long backoffice_calls(CVars in, CVars &out);
long cron_call(CVars in, CVars &out);
#endif
+9
View File
@@ -0,0 +1,9 @@
#ifndef __mx_medTrMembers_h__
#define __mx_medTrMembers_h__
#include "vars.h"
long members_call(CVars in, CVars &out);
#endif
+12
View File
@@ -0,0 +1,12 @@
#ifndef __mx_medTrTransporter_h__
#define __mx_medTrTransporter_h__
#include "vars.h"
long trasnporter_call(CVars in, CVars &out);
#endif
+27
View File
@@ -0,0 +1,27 @@
#ifndef __mx_payments_h__
#define __mx_payments_h__
#include "vars.h"
typedef enum { TT_DEPOSIT, TT_REVERSAL, TT_AUTH, TT_CAPTURE, TT_VOID, TT_VBV_ENROLL,TT_PARES_AUTH, TT_FORCE, TT_VERIFY_ONLY,TT_RECUR_ACTIVATE,TT_RECUR_SUSPEND,TT_RECUR_DELETE,TT_UNKNOWN} ETType;
enum { TD_F_OK, TD_F_REVERSED, TD_F_CANCELLED, TD_F_ERROR };
#define TD_F_VOIDED TD_F_CANCELLED
enum { WHAT_PAYMENT, WHAT_RECHARGE, WHAT_BILLCANCEL, WHAT_PURCHASE, WHAT_BALANCE_PAYMENT, WHAT_SMS_PAYMENT, WHAT_DONATION_PAYMENT, WHAT_SM_BALANCE, WHAT_SM_NEWCARD, WHAT_SM_EXISTCARD, WHAT_BANK_DEPOSIT ,WHAT_TOPUP_BALANCE,WHAT_DIR_TOPUP_CC, WHAT_DIR_TOPUP_BAL };
extern char * WHATs[];
enum { CORE_INIT_O, CORE_SRC_SENT, CORE_SRC_RET, CORE_DEST_SENT, CORE_DEST_RET, CORE_DONE,CORE_INIT, CORE_PENDING_PHONE_VERIFICATION, CORE_FAILED_VERIFICATION };
enum { CORE_F_INIT_O, CORE_F_OK, CORE_F_ERROR, CORE_F_CANCELLED, CORE_F_FRAUD_CANCELLED,CORE_F_INIT, CORE_F_PENDING_VERIFICATION, CORE_F_AUTHOURIZED };
long medTVerifyPaymentType(CVars in, CVars &out);
long medTConductInitialPayment(CVars in, CVars &out);
long kleenConfirmPickup(CVars in, CVars &out);
void Confirmation( unsigned long payment_id, char * number, int sz );
#endif
+28
View File
@@ -0,0 +1,28 @@
#ifndef __PGSQL_H__
#define __PGSQL_H__
#include <libpq-fe.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <string>
#include <map>
#include <vector>
using namespace std;
int pgsql_db_connect(const char*host,const char*name,const char*user,const char*pass,long port);
int pgsql_exec(const char * format, ... );
const PGresult* pgsql_query(const char * format, ... );
int pgsql_num_rows(const PGresult *res);
int pgsql_num_fields(const PGresult *res);
map<const char*,const char*> pgsql_fetch_assoc(const PGresult *res, int row);
vector<const char*> pgsql_fetch_row(const PGresult *res, int row);
void pgsql_close();
char* pgsql_uitoa(unsigned n, char *s, int radix);
#endif
/*
vi:ts=2
*/
+42
View File
@@ -0,0 +1,42 @@
#ifndef __PGSQL_WRAPPER_H__
#define __PGSQL_WRAPPER_H__
#include "exceptions.h"
enum { DBS_ALL=0, DBS_VALID=1, DBS_STREAM=2 };
class CEscape;
#define NEED_ESC CEscape __esc( cmd );
#define esc( param ) __esc.Escape( param )
#define ESCAPE_MAX_VARS 50
void map_to_cvars(map<const char *,const char *>f, CVars &rec);
void load_db_record( const char * table, CVars &rec, const char * where, ... );
long load_db_record( CVars &rec, const char * query, ... );
long insert_db_record( int mode, const char *table, const char *seq, CVars &rec );
void update_db_record( int mode, const char * table, CVars &rec, long id, const char * where=NULL, ... ) throw ( bad_parameter );
void v_update_db_record( int mode, const char * table, CVars &rec, const char *index, long id, const char * where=NULL, va_list ap=NULL ) throw ( bad_parameter );
void update_db_record( int mode, const char * table, CVars &rec, const char *index, long id, const char * where=NULL, ... ) throw ( bad_parameter );
long curr_val( const char *seq );
class CEscape
{
public:
char * New( int sz );
CEscape( char * st );
~CEscape();
char * Escape( const char * param );
private:
char * vars[ESCAPE_MAX_VARS];
int n;
char * st;
char esc[1000];
int EscapeLength( const char * par ); // Calculate the required buffer size for escaped par
char *EscapeReal( const char * cmd, char * _esc=NULL, int sz=0 ); // Escape a string for SQL server
};
#endif
@@ -0,0 +1 @@
#define FILELOG_MAX_LEVEL 9
+18
View File
@@ -0,0 +1,18 @@
#ifndef PHP_JUBABOX_API_H
#define PHP_JUBABOX_API_H
#define PHP_JUBABOX_API_EXTNAME "jubabox_api"
#define PHP_JUBABOX_API_EXTVER "0.1"
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
extern "C" {
#include "php.h"
}
extern zend_module_entry jubabox_api_module_entry;
#define phpext_jubabox_api_ptr &jubabox_api_module_entry;
#endif /* PHP_JUBABOX_API_H */
+1
View File
@@ -0,0 +1 @@
#define JUBABOX_API_NS "jubabox_api_savvy"
+1
View File
@@ -0,0 +1 @@
#define JUBABOX_CONFIG "/home/savvy/savvy/jubabox/etc/"
+1
View File
@@ -0,0 +1 @@
#define JUBABOX_LOG "/home/savvy/savvy/jubabox/logs/jubabox_api.log"
+1
View File
@@ -0,0 +1 @@
#define TMPL_PREFIX "/home/savvy/savvy/jubabox/email/"
+49
View File
@@ -0,0 +1,49 @@
#ifndef __safestr_lib
#define __safestr_lib
#include "config.h"
#define SAFESTRING_COMMON_BUFFER_SIZE 1024
#ifdef __cplusplus
extern "C"
{
#endif
char * strsafecpy( char * dest, const char * src, int size );
char * strnsafecpy( char * dest, const char * src, int n, int size );
char * strsafecat( char * dest, const char * src, int size );
char * strcatf( char * dest, int size, const char * fmt, ... );
char * strnsafecat( char * dest, const char * src, int n, int size );
// Append first n characters of src to dest
char * last_line( char * buf ); // find the last line and return the pointer to its beginning
char * safestrdup( const char *s );
char * strreverse( char *s );
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
char * toupper( char * s, char * dest=0, int sz=0 );
char * tolower( char * s, char * dest=0, int sz=0 );
char * toupper( const char * s, char * dest, int sz );
char * tolower( const char * s, char * dest, int sz );
#endif
//int GetParam(char * params, char _name[], char value[], int valuelen, char ** end = 0 );
#endif
+108
View File
@@ -0,0 +1,108 @@
/*
* FIPS 180-2 SHA-224/256/384/512 implementation
* Last update: 02/02/2007
* Issue date: 04/30/2005
*
* Copyright (C) 2005, 2007 Olivier Gay <olivier.gay@a3.epfl.ch>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the project nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#ifndef SHA2_H
#define SHA2_H
#define SHA224_DIGEST_SIZE ( 224 / 8)
#define SHA256_DIGEST_SIZE ( 256 / 8)
#define SHA384_DIGEST_SIZE ( 384 / 8)
#define SHA512_DIGEST_SIZE ( 512 / 8)
#define SHA256_BLOCK_SIZE ( 512 / 8)
#define SHA512_BLOCK_SIZE (1024 / 8)
#define SHA384_BLOCK_SIZE SHA512_BLOCK_SIZE
#define SHA224_BLOCK_SIZE SHA256_BLOCK_SIZE
#ifndef SHA2_TYPES
#define SHA2_TYPES
typedef unsigned char uint8;
typedef unsigned int uint32;
typedef unsigned long long uint64;
#endif
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
unsigned int tot_len;
unsigned int len;
unsigned char block[2 * SHA256_BLOCK_SIZE];
uint32 h[8];
} sha256_ctx;
typedef struct {
unsigned int tot_len;
unsigned int len;
unsigned char block[2 * SHA512_BLOCK_SIZE];
uint64 h[8];
} sha512_ctx;
typedef sha512_ctx sha384_ctx;
typedef sha256_ctx sha224_ctx;
void sha224_init(sha224_ctx *ctx);
void sha224_update(sha224_ctx *ctx, const unsigned char *message,
unsigned int len);
void sha224_final(sha224_ctx *ctx, unsigned char *digest);
void sha224(const unsigned char *message, unsigned int len,
unsigned char *digest);
void sha256_init(sha256_ctx * ctx);
void sha256_update(sha256_ctx *ctx, const unsigned char *message,
unsigned int len);
void sha256_final(sha256_ctx *ctx, unsigned char *digest);
void sha256(const unsigned char *message, unsigned int len,
unsigned char *digest);
void sha384_init(sha384_ctx *ctx);
void sha384_update(sha384_ctx *ctx, const unsigned char *message,
unsigned int len);
void sha384_final(sha384_ctx *ctx, unsigned char *digest);
void sha384(const unsigned char *message, unsigned int len,
unsigned char *digest);
void sha512_init(sha512_ctx *ctx);
void sha512_update(sha512_ctx *ctx, const unsigned char *message,
unsigned int len);
void sha512_final(sha512_ctx *ctx, unsigned char *digest);
void sha512(const unsigned char *message, unsigned int len,
unsigned char *digest);
#ifdef __cplusplus
}
#endif
#endif /* !SHA2_H */
+10
View File
@@ -0,0 +1,10 @@
#ifndef __SHA512_H__
#define __SHA512_H__
#include<string>
using namespace std;
string hash_sha512_cpp(string msg_arr);
#endif
+10
View File
@@ -0,0 +1,10 @@
#ifndef __smtp_lib
#define __smtp_lib
#include "php_tmpl_prefix.h"
#define EMAIL_PREFIX TMPL_PREFIX
int SMTP2( const char * _server, const char * _from, char * _to, char * _body, const char * _domain, const char * _user, const char * _pass, const char * _name);
#endif
+27
View File
@@ -0,0 +1,27 @@
#ifndef __STRIPE_H__
#define __STRIPE_H__
#include <vector>
#include <string>
using namespace std;
void remove_all_chars(char* str, char c);
long stripe_tokenize_card(const char *key, const char *ccnum, const char *ccexpm, const char *ccexpy, const char *cccvc, char *token, size_t token_size);
long stripe_get_all_cards(const char *key, char *customer, vector <string> *ccids, vector <string> *ccdigits, vector <string> *ccexpm, vector <string> *ccexpy);
long stripe_get_card(const char *key, char *customer, const char *ccdigits, const char *ccexpm, const char *ccexpy, char *card, size_t card_size);
long stripe_create_card(const char *key, char *customer, char *token, char *card, size_t card_size);
long stripe_charge_token(const char *key, char *token, int amount, const char *currency, const char *description, const char *metadata, char *id, size_t id_size);
long stripe_create_customer(const char *key, char *token, const char *email, const char *description, const char *metadata, char *id, size_t id_size);
long stripe_charge_customer(const char *key, char *customer, int amount, const char *currency, const char *description, const char *metadata, char *id, size_t id_size);
long stripe_update_customer(const char *key, char *customer, const char *entity, const char *entity_value, const char *result, char *data, size_t data_size);
long stripe_charge_real(const char *key, const char *entity_name, char *entity, int amount, const char *currency, const char *description, const char *metadata, char *id, size_t id_size);
string stripe_get_card_type(const char *card);
/*
* https://stripe.com/docs/api/curl#create_card
* https://stripe.com/docs/testing#cards
* https://dashboard.stripe.com
*/
#endif
+13
View File
@@ -0,0 +1,13 @@
#ifndef __stripe_charge_h__
#define __stripe_charge_h__
#include "vars.h"
long stripe_save_card(CVars in, CVars &out);
long stripe_one_time_charge(CVars in, CVars &out);
long stripe_new_customer_charge(CVars in, CVars &out);
long stripe_charge_member(CVars in, CVars &out);
long stripe_charge_member_paymentid(CVars in, CVars &out);
#endif
+20
View File
@@ -0,0 +1,20 @@
#ifndef __timer_h__
#define __timer_h__
class CTimer
{
public:
CTimer( );
void init();
bool timeout( unsigned long t );
void wake( unsigned long );
unsigned long elapsed( );
private:
unsigned long prev;
};
#endif
+10
View File
@@ -0,0 +1,10 @@
#ifndef __UTIL_H__
#define __UTIL_H__
bool reg_match( const char * input, const char * regexp, char * ret=NULL, int sz=0, int * pos = NULL );
//char * urlencode(const char * buf); // Encode a string using URL-encoding
char * urlencode(const char * buf, char *, int ); // Encode a string using URL-encoding
//char * urldecode( char * buf); // Decode a string using URL-encoding
char * urldecode( char * buf, char *, int ); // Decode a string using URL-encoding
#endif
+125
View File
@@ -0,0 +1,125 @@
#ifndef __vars_h__
#define __vars_h__
#pragma interface
#include <map>
#include <string>
using std::string;
using std::map;
/*
struct hash_str
{
inline size_t string_hf(const string& str)
{ return hash(str.c_str()); }
};
struct MyHASHER : public hash<const char*>{
size_t operator(string a_string){
return (*this)( a_string.c_str() );
}
}
struct eqstr
{
bool operator()(const char* s1, const char* s2) const
{
return strcmp(s1, s2) == 0;
}
};
*/
class varstring : public string
{
public:
varstring();
varstring( const varstring &c );
varstring( const string &c );
varstring( const char* c, int len);
varstring( const char *c );
long Long() const;
double Double();
varstring& operator=( const char* c );
void operator=( long l );
void operator=( const string c );
varstring& operator=( const varstring &c );
operator long(); // type conversion
operator const char*(); // type conversion
bool valid() const;
void set_valid( bool validated = true );
bool db() const;
void set_db( bool validated = true );
bool binary() const;
void set_binary( bool binary = true );
friend class CVars;
private:
bool validated;
bool db_var; // is this variable to be used in DB updates
bool binary_var;
};
/*
class string_key : public string
{
public:
string_key& operator=( const char* c );
void operator=( long l );
void operator=( const string c );
string_key();
string_key( const char *c );
bool valid() const;
void set_valid( bool validated = true );
private:
bool validated;
};
*/
typedef
// hash_map<const char*, char*, hash<const char*>, eqstr>
// map< string_key, varstring >
map< const string, varstring >
CVars1;
class CVars : public CVars1
{
public:
CVars() : CVars1() {};
CVars& operator<<( char const *name ); // schedule for db processing
CVars& operator>>( char const *name ); // ignore db processing for this variable
void ClearDB();
long serialize( unsigned char *&buf ); // this will serialize the data into buf and return the resulting size
// it is the responsibility of the caller to free the buffer with free()
int deserialize( unsigned char *buf, long buf_sz ); // this will initialize the current instance by de-serializing the data from buf
// returns number of elements de-serialized
};
#endif
@@ -0,0 +1,85 @@
libconfig___la-grammar.lo: grammar.c /usr/include/string.h \
/usr/include/features.h /usr/include/sys/cdefs.h \
/usr/include/bits/wordsize.h /usr/include/gnu/stubs.h \
/usr/include/gnu/stubs-64.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stddef.h \
/usr/include/xlocale.h /usr/include/stdlib.h \
/usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
/usr/include/endian.h /usr/include/bits/endian.h \
/usr/include/bits/byteswap.h /usr/include/sys/types.h \
/usr/include/bits/types.h /usr/include/bits/typesizes.h \
/usr/include/time.h /usr/include/sys/select.h /usr/include/bits/select.h \
/usr/include/bits/sigset.h /usr/include/bits/time.h \
/usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h \
/usr/include/alloca.h libconfig.h /usr/include/stdio.h \
/usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stdarg.h \
/usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h private.h
/usr/include/string.h:
/usr/include/features.h:
/usr/include/sys/cdefs.h:
/usr/include/bits/wordsize.h:
/usr/include/gnu/stubs.h:
/usr/include/gnu/stubs-64.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stddef.h:
/usr/include/xlocale.h:
/usr/include/stdlib.h:
/usr/include/bits/waitflags.h:
/usr/include/bits/waitstatus.h:
/usr/include/endian.h:
/usr/include/bits/endian.h:
/usr/include/bits/byteswap.h:
/usr/include/sys/types.h:
/usr/include/bits/types.h:
/usr/include/bits/typesizes.h:
/usr/include/time.h:
/usr/include/sys/select.h:
/usr/include/bits/select.h:
/usr/include/bits/sigset.h:
/usr/include/bits/time.h:
/usr/include/sys/sysmacros.h:
/usr/include/bits/pthreadtypes.h:
/usr/include/alloca.h:
libconfig.h:
/usr/include/stdio.h:
/usr/include/libio.h:
/usr/include/_G_config.h:
/usr/include/wchar.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stdarg.h:
/usr/include/bits/stdio_lim.h:
/usr/include/bits/sys_errlist.h:
private.h:
@@ -0,0 +1,116 @@
libconfig___la-libconfig.lo: libconfig.c ac_config.h libconfig.h \
/usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
/usr/include/bits/wordsize.h /usr/include/gnu/stubs.h \
/usr/include/gnu/stubs-64.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stddef.h \
/usr/include/bits/types.h /usr/include/bits/typesizes.h \
/usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stdarg.h \
/usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h grammar.h \
scanner.h /usr/include/string.h /usr/include/xlocale.h \
/usr/include/errno.h /usr/include/bits/errno.h \
/usr/include/linux/errno.h /usr/include/asm/errno.h \
/usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \
/usr/include/stdlib.h /usr/include/bits/waitflags.h \
/usr/include/bits/waitstatus.h /usr/include/endian.h \
/usr/include/bits/endian.h /usr/include/bits/byteswap.h \
/usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
/usr/include/bits/select.h /usr/include/bits/sigset.h \
/usr/include/bits/time.h /usr/include/sys/sysmacros.h \
/usr/include/bits/pthreadtypes.h /usr/include/alloca.h private.h \
wincompat.h /usr/include/locale.h /usr/include/bits/locale.h \
/usr/include/ctype.h
ac_config.h:
libconfig.h:
/usr/include/stdio.h:
/usr/include/features.h:
/usr/include/sys/cdefs.h:
/usr/include/bits/wordsize.h:
/usr/include/gnu/stubs.h:
/usr/include/gnu/stubs-64.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stddef.h:
/usr/include/bits/types.h:
/usr/include/bits/typesizes.h:
/usr/include/libio.h:
/usr/include/_G_config.h:
/usr/include/wchar.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stdarg.h:
/usr/include/bits/stdio_lim.h:
/usr/include/bits/sys_errlist.h:
grammar.h:
scanner.h:
/usr/include/string.h:
/usr/include/xlocale.h:
/usr/include/errno.h:
/usr/include/bits/errno.h:
/usr/include/linux/errno.h:
/usr/include/asm/errno.h:
/usr/include/asm-generic/errno.h:
/usr/include/asm-generic/errno-base.h:
/usr/include/stdlib.h:
/usr/include/bits/waitflags.h:
/usr/include/bits/waitstatus.h:
/usr/include/endian.h:
/usr/include/bits/endian.h:
/usr/include/bits/byteswap.h:
/usr/include/sys/types.h:
/usr/include/time.h:
/usr/include/sys/select.h:
/usr/include/bits/select.h:
/usr/include/bits/sigset.h:
/usr/include/bits/time.h:
/usr/include/sys/sysmacros.h:
/usr/include/bits/pthreadtypes.h:
/usr/include/alloca.h:
private.h:
wincompat.h:
/usr/include/locale.h:
/usr/include/bits/locale.h:
/usr/include/ctype.h:
@@ -0,0 +1,332 @@
libconfig___la-libconfigcpp.lo: libconfigcpp.c++ libconfig.h++ \
/usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
/usr/include/bits/wordsize.h /usr/include/gnu/stubs.h \
/usr/include/gnu/stubs-64.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stddef.h \
/usr/include/bits/types.h /usr/include/bits/typesizes.h \
/usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stdarg.h \
/usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/string \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/x86_64-redhat-linux/bits/c++config.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/x86_64-redhat-linux/bits/os_defines.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/x86_64-redhat-linux/bits/cpu_defines.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stringfwd.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/char_traits.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_algobase.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/cstddef \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/functexcept.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/exception_defines.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/cpp_type_traits.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ext/type_traits.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ext/numeric_traits.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_pair.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/move.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/concept_check.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_iterator_base_types.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_iterator_base_funcs.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_iterator.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/debug/debug.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/postypes.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/cwchar \
/usr/include/bits/wchar.h /usr/include/xlocale.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/allocator.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/x86_64-redhat-linux/bits/c++allocator.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ext/new_allocator.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/new \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/exception \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/localefwd.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/x86_64-redhat-linux/bits/c++locale.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/clocale \
/usr/include/locale.h /usr/include/bits/locale.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/iosfwd \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/cctype \
/usr/include/ctype.h /usr/include/endian.h /usr/include/bits/endian.h \
/usr/include/bits/byteswap.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/ostream_insert.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/cxxabi-forced.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_function.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/backward/binders.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/basic_string.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ext/atomicity.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/x86_64-redhat-linux/bits/gthr.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/x86_64-redhat-linux/bits/gthr-default.h \
/usr/include/pthread.h /usr/include/sched.h /usr/include/time.h \
/usr/include/bits/sched.h /usr/include/bits/time.h \
/usr/include/bits/pthreadtypes.h /usr/include/bits/setjmp.h \
/usr/include/unistd.h /usr/include/bits/posix_opt.h \
/usr/include/bits/environments.h /usr/include/bits/confname.h \
/usr/include/getopt.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/x86_64-redhat-linux/bits/atomic_word.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/initializer_list \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/basic_string.tcc \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/map \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_tree.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_map.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_multimap.h \
libconfig.h wincompat.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/cstring \
/usr/include/string.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/cstdlib \
/usr/include/stdlib.h /usr/include/bits/waitflags.h \
/usr/include/bits/waitstatus.h /usr/include/sys/types.h \
/usr/include/sys/select.h /usr/include/bits/select.h \
/usr/include/bits/sigset.h /usr/include/sys/sysmacros.h \
/usr/include/alloca.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/sstream \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/istream \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ios \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/ios_base.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/locale_classes.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/locale_classes.tcc \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/streambuf \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/streambuf.tcc \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/basic_ios.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/locale_facets.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/cwctype \
/usr/include/wctype.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/x86_64-redhat-linux/bits/ctype_base.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/streambuf_iterator.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/x86_64-redhat-linux/bits/ctype_inline.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/locale_facets.tcc \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/basic_ios.tcc \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ostream \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/ostream.tcc \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/istream.tcc \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/sstream.tcc
libconfig.h++:
/usr/include/stdio.h:
/usr/include/features.h:
/usr/include/sys/cdefs.h:
/usr/include/bits/wordsize.h:
/usr/include/gnu/stubs.h:
/usr/include/gnu/stubs-64.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stddef.h:
/usr/include/bits/types.h:
/usr/include/bits/typesizes.h:
/usr/include/libio.h:
/usr/include/_G_config.h:
/usr/include/wchar.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stdarg.h:
/usr/include/bits/stdio_lim.h:
/usr/include/bits/sys_errlist.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/string:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/x86_64-redhat-linux/bits/c++config.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/x86_64-redhat-linux/bits/os_defines.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/x86_64-redhat-linux/bits/cpu_defines.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stringfwd.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/char_traits.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_algobase.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/cstddef:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/functexcept.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/exception_defines.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/cpp_type_traits.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ext/type_traits.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ext/numeric_traits.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_pair.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/move.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/concept_check.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_iterator_base_types.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_iterator_base_funcs.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_iterator.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/debug/debug.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/postypes.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/cwchar:
/usr/include/bits/wchar.h:
/usr/include/xlocale.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/allocator.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/x86_64-redhat-linux/bits/c++allocator.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ext/new_allocator.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/new:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/exception:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/localefwd.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/x86_64-redhat-linux/bits/c++locale.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/clocale:
/usr/include/locale.h:
/usr/include/bits/locale.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/iosfwd:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/cctype:
/usr/include/ctype.h:
/usr/include/endian.h:
/usr/include/bits/endian.h:
/usr/include/bits/byteswap.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/ostream_insert.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/cxxabi-forced.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_function.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/backward/binders.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/basic_string.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ext/atomicity.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/x86_64-redhat-linux/bits/gthr.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/x86_64-redhat-linux/bits/gthr-default.h:
/usr/include/pthread.h:
/usr/include/sched.h:
/usr/include/time.h:
/usr/include/bits/sched.h:
/usr/include/bits/time.h:
/usr/include/bits/pthreadtypes.h:
/usr/include/bits/setjmp.h:
/usr/include/unistd.h:
/usr/include/bits/posix_opt.h:
/usr/include/bits/environments.h:
/usr/include/bits/confname.h:
/usr/include/getopt.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/x86_64-redhat-linux/bits/atomic_word.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/initializer_list:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/basic_string.tcc:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/map:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_tree.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_map.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_multimap.h:
libconfig.h:
wincompat.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/cstring:
/usr/include/string.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/cstdlib:
/usr/include/stdlib.h:
/usr/include/bits/waitflags.h:
/usr/include/bits/waitstatus.h:
/usr/include/sys/types.h:
/usr/include/sys/select.h:
/usr/include/bits/select.h:
/usr/include/bits/sigset.h:
/usr/include/sys/sysmacros.h:
/usr/include/alloca.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/sstream:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/istream:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ios:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/ios_base.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/locale_classes.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/locale_classes.tcc:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/streambuf:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/streambuf.tcc:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/basic_ios.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/locale_facets.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/cwctype:
/usr/include/wctype.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/x86_64-redhat-linux/bits/ctype_base.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/streambuf_iterator.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/x86_64-redhat-linux/bits/ctype_inline.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/locale_facets.tcc:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/basic_ios.tcc:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ostream:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/ostream.tcc:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/istream.tcc:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/sstream.tcc:
@@ -0,0 +1,102 @@
libconfig___la-scanner.lo: scanner.c /usr/include/stdio.h \
/usr/include/features.h /usr/include/sys/cdefs.h \
/usr/include/bits/wordsize.h /usr/include/gnu/stubs.h \
/usr/include/gnu/stubs-64.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stddef.h \
/usr/include/bits/types.h /usr/include/bits/typesizes.h \
/usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stdarg.h \
/usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
/usr/include/string.h /usr/include/xlocale.h /usr/include/errno.h \
/usr/include/bits/errno.h /usr/include/linux/errno.h \
/usr/include/asm/errno.h /usr/include/asm-generic/errno.h \
/usr/include/asm-generic/errno-base.h /usr/include/stdlib.h \
/usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
/usr/include/endian.h /usr/include/bits/endian.h \
/usr/include/bits/byteswap.h /usr/include/sys/types.h \
/usr/include/time.h /usr/include/sys/select.h /usr/include/bits/select.h \
/usr/include/bits/sigset.h /usr/include/bits/time.h \
/usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h \
/usr/include/alloca.h /usr/include/ctype.h grammar.h wincompat.h
/usr/include/stdio.h:
/usr/include/features.h:
/usr/include/sys/cdefs.h:
/usr/include/bits/wordsize.h:
/usr/include/gnu/stubs.h:
/usr/include/gnu/stubs-64.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stddef.h:
/usr/include/bits/types.h:
/usr/include/bits/typesizes.h:
/usr/include/libio.h:
/usr/include/_G_config.h:
/usr/include/wchar.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stdarg.h:
/usr/include/bits/stdio_lim.h:
/usr/include/bits/sys_errlist.h:
/usr/include/string.h:
/usr/include/xlocale.h:
/usr/include/errno.h:
/usr/include/bits/errno.h:
/usr/include/linux/errno.h:
/usr/include/asm/errno.h:
/usr/include/asm-generic/errno.h:
/usr/include/asm-generic/errno-base.h:
/usr/include/stdlib.h:
/usr/include/bits/waitflags.h:
/usr/include/bits/waitstatus.h:
/usr/include/endian.h:
/usr/include/bits/endian.h:
/usr/include/bits/byteswap.h:
/usr/include/sys/types.h:
/usr/include/time.h:
/usr/include/sys/select.h:
/usr/include/bits/select.h:
/usr/include/bits/sigset.h:
/usr/include/bits/time.h:
/usr/include/sys/sysmacros.h:
/usr/include/bits/pthreadtypes.h:
/usr/include/alloca.h:
/usr/include/ctype.h:
grammar.h:
wincompat.h:
@@ -0,0 +1,85 @@
libconfig_la-grammar.lo: grammar.c /usr/include/string.h \
/usr/include/features.h /usr/include/sys/cdefs.h \
/usr/include/bits/wordsize.h /usr/include/gnu/stubs.h \
/usr/include/gnu/stubs-64.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stddef.h \
/usr/include/xlocale.h /usr/include/stdlib.h \
/usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
/usr/include/endian.h /usr/include/bits/endian.h \
/usr/include/bits/byteswap.h /usr/include/sys/types.h \
/usr/include/bits/types.h /usr/include/bits/typesizes.h \
/usr/include/time.h /usr/include/sys/select.h /usr/include/bits/select.h \
/usr/include/bits/sigset.h /usr/include/bits/time.h \
/usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h \
/usr/include/alloca.h libconfig.h /usr/include/stdio.h \
/usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stdarg.h \
/usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h private.h
/usr/include/string.h:
/usr/include/features.h:
/usr/include/sys/cdefs.h:
/usr/include/bits/wordsize.h:
/usr/include/gnu/stubs.h:
/usr/include/gnu/stubs-64.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stddef.h:
/usr/include/xlocale.h:
/usr/include/stdlib.h:
/usr/include/bits/waitflags.h:
/usr/include/bits/waitstatus.h:
/usr/include/endian.h:
/usr/include/bits/endian.h:
/usr/include/bits/byteswap.h:
/usr/include/sys/types.h:
/usr/include/bits/types.h:
/usr/include/bits/typesizes.h:
/usr/include/time.h:
/usr/include/sys/select.h:
/usr/include/bits/select.h:
/usr/include/bits/sigset.h:
/usr/include/bits/time.h:
/usr/include/sys/sysmacros.h:
/usr/include/bits/pthreadtypes.h:
/usr/include/alloca.h:
libconfig.h:
/usr/include/stdio.h:
/usr/include/libio.h:
/usr/include/_G_config.h:
/usr/include/wchar.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stdarg.h:
/usr/include/bits/stdio_lim.h:
/usr/include/bits/sys_errlist.h:
private.h:
@@ -0,0 +1,116 @@
libconfig_la-libconfig.lo: libconfig.c ac_config.h libconfig.h \
/usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h \
/usr/include/bits/wordsize.h /usr/include/gnu/stubs.h \
/usr/include/gnu/stubs-64.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stddef.h \
/usr/include/bits/types.h /usr/include/bits/typesizes.h \
/usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stdarg.h \
/usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h grammar.h \
scanner.h /usr/include/string.h /usr/include/xlocale.h \
/usr/include/errno.h /usr/include/bits/errno.h \
/usr/include/linux/errno.h /usr/include/asm/errno.h \
/usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \
/usr/include/stdlib.h /usr/include/bits/waitflags.h \
/usr/include/bits/waitstatus.h /usr/include/endian.h \
/usr/include/bits/endian.h /usr/include/bits/byteswap.h \
/usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
/usr/include/bits/select.h /usr/include/bits/sigset.h \
/usr/include/bits/time.h /usr/include/sys/sysmacros.h \
/usr/include/bits/pthreadtypes.h /usr/include/alloca.h private.h \
wincompat.h /usr/include/locale.h /usr/include/bits/locale.h \
/usr/include/ctype.h
ac_config.h:
libconfig.h:
/usr/include/stdio.h:
/usr/include/features.h:
/usr/include/sys/cdefs.h:
/usr/include/bits/wordsize.h:
/usr/include/gnu/stubs.h:
/usr/include/gnu/stubs-64.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stddef.h:
/usr/include/bits/types.h:
/usr/include/bits/typesizes.h:
/usr/include/libio.h:
/usr/include/_G_config.h:
/usr/include/wchar.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stdarg.h:
/usr/include/bits/stdio_lim.h:
/usr/include/bits/sys_errlist.h:
grammar.h:
scanner.h:
/usr/include/string.h:
/usr/include/xlocale.h:
/usr/include/errno.h:
/usr/include/bits/errno.h:
/usr/include/linux/errno.h:
/usr/include/asm/errno.h:
/usr/include/asm-generic/errno.h:
/usr/include/asm-generic/errno-base.h:
/usr/include/stdlib.h:
/usr/include/bits/waitflags.h:
/usr/include/bits/waitstatus.h:
/usr/include/endian.h:
/usr/include/bits/endian.h:
/usr/include/bits/byteswap.h:
/usr/include/sys/types.h:
/usr/include/time.h:
/usr/include/sys/select.h:
/usr/include/bits/select.h:
/usr/include/bits/sigset.h:
/usr/include/bits/time.h:
/usr/include/sys/sysmacros.h:
/usr/include/bits/pthreadtypes.h:
/usr/include/alloca.h:
private.h:
wincompat.h:
/usr/include/locale.h:
/usr/include/bits/locale.h:
/usr/include/ctype.h:
@@ -0,0 +1,102 @@
libconfig_la-scanner.lo: scanner.c /usr/include/stdio.h \
/usr/include/features.h /usr/include/sys/cdefs.h \
/usr/include/bits/wordsize.h /usr/include/gnu/stubs.h \
/usr/include/gnu/stubs-64.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stddef.h \
/usr/include/bits/types.h /usr/include/bits/typesizes.h \
/usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stdarg.h \
/usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
/usr/include/string.h /usr/include/xlocale.h /usr/include/errno.h \
/usr/include/bits/errno.h /usr/include/linux/errno.h \
/usr/include/asm/errno.h /usr/include/asm-generic/errno.h \
/usr/include/asm-generic/errno-base.h /usr/include/stdlib.h \
/usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
/usr/include/endian.h /usr/include/bits/endian.h \
/usr/include/bits/byteswap.h /usr/include/sys/types.h \
/usr/include/time.h /usr/include/sys/select.h /usr/include/bits/select.h \
/usr/include/bits/sigset.h /usr/include/bits/time.h \
/usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h \
/usr/include/alloca.h /usr/include/ctype.h grammar.h wincompat.h
/usr/include/stdio.h:
/usr/include/features.h:
/usr/include/sys/cdefs.h:
/usr/include/bits/wordsize.h:
/usr/include/gnu/stubs.h:
/usr/include/gnu/stubs-64.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stddef.h:
/usr/include/bits/types.h:
/usr/include/bits/typesizes.h:
/usr/include/libio.h:
/usr/include/_G_config.h:
/usr/include/wchar.h:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/include/stdarg.h:
/usr/include/bits/stdio_lim.h:
/usr/include/bits/sys_errlist.h:
/usr/include/string.h:
/usr/include/xlocale.h:
/usr/include/errno.h:
/usr/include/bits/errno.h:
/usr/include/linux/errno.h:
/usr/include/asm/errno.h:
/usr/include/asm-generic/errno.h:
/usr/include/asm-generic/errno-base.h:
/usr/include/stdlib.h:
/usr/include/bits/waitflags.h:
/usr/include/bits/waitstatus.h:
/usr/include/endian.h:
/usr/include/bits/endian.h:
/usr/include/bits/byteswap.h:
/usr/include/sys/types.h:
/usr/include/time.h:
/usr/include/sys/select.h:
/usr/include/bits/select.h:
/usr/include/bits/sigset.h:
/usr/include/bits/time.h:
/usr/include/sys/sysmacros.h:
/usr/include/bits/pthreadtypes.h:
/usr/include/alloca.h:
/usr/include/ctype.h:
grammar.h:
wincompat.h:
+5
View File
@@ -0,0 +1,5 @@
Mark Lindner - Lead developer & maintainer.
Daniel Marjamäki - Enhancements & bugfixes.
Andrew Tytula - Windows Port.
Glenn Herteg - Enhancements, bugfixes, documentation corrections.
+510
View File
@@ -0,0 +1,510 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations
below.
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.
To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.
When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.
We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it
becomes a de-facto standard. To achieve this, non-free programs must
be allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.
Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control
compilation and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (1) uses at run time a
copy of the library already present on the user's computer system,
rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at least
three years, to give the same user the materials specified in
Subsection 6a, above, for a charge no more than the cost of
performing this distribution.
d) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
e) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply, and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License
may add an explicit geographical distribution limitation excluding those
countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms
of the ordinary General Public License).
To apply these terms, attach the following notices to the library.
It is safest to attach them to the start of each source file to most
effectively convey the exclusion of warranty; and each file should
have at least the "copyright" line and a pointer to where the full
notice is found.
<one line to give the library's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or
your school, if any, to sign a "copyright disclaimer" for the library,
if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James
Random Hacker.
<signature of Ty Coon>, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!

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