MSRCS += ml-security.cc
+MLDADD += -lmd
#MSRCS += ml-fetch.cc
#MLDADD += -lfetch
.ifdef UTF8JP
#include "util_string.h"
#include "utf8.h"
#include <exception>
+#include <unistd.h>
//#define DB5_DBDIR_HACK 1
#define DEFAULT_RETRY 10
*/
static void randomSleep () {
- usleep (10000 + 100000 * randDouble ());
+ usleep ((useconds_t)(10000 + 100000 * randDouble ()));
}
int MLSqlite3::open (ustring& name) {
#ifdef DEBUG2
std::cerr << q;
#endif /* DEBUG */
- if (fpost) {
+// if (fpost) {
+// if (method == M_POST) {
+ switch (method) {
+ case M_POST:
if (formData) {
writeFileForm (&client, mlenv);
} else if (rawquery.length () > 0) {
client.write (&*rawquery.begin (), rawquery.length ());
+ } else if (rawqueryfile.length () > 0) {
+ writeFile (&client, rawqueryfile);
} else {
writeQueryForm (params (), client);
}
+ break;
+ case M_PUT:
+ if (rawquery.length () > 0) {
+ client.write (&*rawquery.begin (), rawquery.length ());
+ } else if (rawqueryfile.length () > 0) {
+ writeFile (&client, rawqueryfile);
+ }
+ break;
+ default:;
}
client.flush_write ();
status = HTTP_QUERY;
assert (0);
}
q.append (uSPC).append (path);
- if (fpost) {
+// if (fpost) {
+// if (method == M_POST) {
+ switch (method) {
+ case M_POST:
if (formData)
makeSeparator ();
if (getparams ()) {
q.append (CharConst ("?"));
appendQueryForm (getparams (), q);
}
- q.append (CharConst (" HTTP/1.0" kCRLF));
- } else {
+ break;
+ case M_PUT:
+ if (getparams ()) {
+ q.append (CharConst ("?"));
+ appendQueryForm (getparams (), q);
+ }
+ break;
+ default:
if (getparams ()) {
q.append (CharConst ("?"));
appendQueryForm (getparams (), q);
q.append (CharConst ("?"));
appendQueryForm (params (), q);
}
- q.append (CharConst (" HTTP/1.0" kCRLF));
}
+ q.append (CharConst (" HTTP/1.0" kCRLF));
if (reqhost.length () > 0) {
makeHeader (q, ustring (CharConst ("Host")), reqhost);
} else {
for (std::vector<mapelem>::iterator i = header_req.begin (); i < header_req.end (); i ++) {
makeHeader (q, (*i).first, (*i).second);
}
- if (fpost)
+// if (fpost)
+// if (method == M_POST)
+ switch (method) {
+ case M_POST:
if (formData) {
q.append (CharConst ("Content-Length: ")).append (to_ustring (writeFileForm (NULL, mlenv))).append (uCRLF);
// q.append (CharConst ("Content-Type: multipart/form-data; boundary=")).append (separator).append (uCRLF);
querytype.assign (CharConst ("multipart/form-data; boundary=")).append (separator);
} else if (rawquery.length () > 0) {
q.append (CharConst ("Content-Length: ")).append (to_ustring (rawquery.length ())).append (uCRLF);
+ } else if (rawqueryfile.length () > 0) {
+ off_t s;
+ fileSize (rawqueryfile, s);
+ q.append (CharConst ("Content-Length: ")).append (to_ustring (s)).append (uCRLF);
} else {
q.append (CharConst ("Content-Length: ")).append (to_ustring (queryFormSize (params ()))).append (uCRLF);
}
+ break;
+ case M_PUT:
+ if (rawquery.length () > 0) {
+ q.append (CharConst ("Content-Length: ")).append (to_ustring (rawquery.length ())).append (uCRLF);
+ } else if (rawqueryfile.length () > 0) {
+ off_t s;
+ fileSize (rawqueryfile, s);
+ q.append (CharConst ("Content-Length: ")).append (to_ustring (s)).append (uCRLF);
+ }
+ break;
+ default:;
+ }
if (querytype.length () > 0)
q.append (CharConst ("Content-Type: ")).append (querytype).append (uCRLF);
q.append (CharConst ("Connection: close" kCRLF kCRLF));
HTTP_HEAD,
HTTP_DONE,
} status;
- bool fpost;
+// bool fpost;
// ustring method;
enum method_t {
M_GET, M_HEAD, M_POST, M_OPTIONS, M_PUT, M_DELETE,
MNodePtr params;
MNodePtr getparams;
ustring rawquery;
+ ustring rawqueryfile;
ustring querytype;
MNodePtr fileparams_store;
MNodePtr fileparams_storage;
HTTPSend () {
method = M_GET;
status = HTTP_INIT;
- fpost = false;
+// fpost = false;
paramsLen = 0;
responseCode = 0;
useproxy = false;
// virtual void setMethod (const ustring& _method, bool fpost);
virtual void setMethod (method_t _method) {
method = _method;
- if (method == M_POST)
- fpost = true;
- else
- fpost = false;
+// if (method == M_POST)
+// fpost = true;
+// else
+// fpost = false;
};
virtual void setPostFileMethod () {
method = M_POST;
- fpost = true;
+// fpost = true;
formData = true;
};
virtual bool submit (TcpClient& client, TcpBuf& buf, MlEnv* mlenv);
${W}, ${w}
${o}
*/
-ustring formatDateString (const ustring& format, time_t tm) {
+//ustring formatDateString (const ustring& format, time_t tm) {
+ustring formatDateString (const ustring& format, struct tm& v) {
ustring ans;
- struct tm v;
+// struct tm v;
uiterator b, e;
umatch m;
int pc;
static uregex re ("\\$\\{(([YMDhmsWwo])(:([0-9]))?|M:((name)|(ab)|(abname)))\\}");
std::vector<ustring> fpar;
- localtime_r (&tm, &v);
+// localtime_r (&tm, &v);
b = format.begin ();
e = format.end ();
while (usearch (b, e, m, re)) {
ustring toUpper (const ustring& str) {
return boost::to_upper_copy (str);
}
+
+ustring hexEncode (const ustring& data) {
+ ustring ans;
+ uiterator b, e;
+
+ ans.reserve (data.length () * 2);
+ b = data.begin ();
+ e = data.end ();
+ for (; b < e; b ++) {
+ ans.append (1, hexchar ((*b >> 4) & 0x0f));
+ ans.append (1, hexchar (*b & 0x0f));
+ }
+ return ans;
+}
class MNodePtr;
ustring formatString (const ustring& format, boost::ptr_vector<MNodePtr>& par);
-ustring formatDateString (const ustring& format, time_t tm);
+//ustring formatDateString (const ustring& format, time_t tm);
+ustring formatDateString (const ustring& format, struct tm& v);
ustring toLower (const ustring& str);
ustring toUpper (const ustring& str);
+ustring hexEncode (const ustring& data);
#endif /* UTIL_STRING_H */
[:id STRING] [:password STRING | :pw STRING]
[:query '((NAME . VALUE) ...)] [:get-query '((NAME . VALUE) ...)]
[:raw-query TEXT]
+ [:raw-file-serial NAME] [:raw-file-named NAME] [:raw-file-static NAME]
[:query-type MIMETYPE]
[:post-file-serial '((NAME . VALUE) ...)]
[:post-file-named '((NAME . VALUE) ...)]
{CharConst ("no-verify"), true}, // 24
{CharConst ("raw-query"), false}, // 25
{CharConst ("query-type"), false}, // 26
+ {CharConst ("raw-file-serial"), false}, // 27
+ {CharConst ("raw-file-named"), false}, // 28
+ {CharConst ("raw-file-static"), false}, // 29
{NULL, 0, 0}
};
if (!checkASCII (obj.http->querytype))
throw (obj.http->querytype + ustring (CharConst (": bad type")));
}
+ if (keywords[27]) // raw-file-serial
+ obj.http->rawqueryfile = mlenv->env->path_store_file (eval_str (keywords[27], mlenv));
+ if (keywords[28]) // raw-file-named
+ obj.http->rawqueryfile = mlenv->env->path_storage_file (eval_str (keywords[28], mlenv));
+ if (keywords[29]) // raw-file-static
+ obj.http->rawqueryfile = mlenv->env->path_static_file (eval_str (keywords[29], mlenv));
url_sub (url, obj.http);
if (obj.http->proto.empty ()) {
#include "ml-security.h"
+#include "ml-store.h"
#include "ml.h"
#include "mlenv.h"
#include "expr.h"
#include "util_base64.h"
#include "util_string.h"
+#include "filemacro.h"
#include "ustring.h"
+#include <md5.h>
#include <openssl/hmac.h>
-
+#include <sys/types.h>
/*DOC:
==cryptographic functions
HMAC (EVP_sha1 (), key.c_str (), key.length (), uchar_type (text.c_str ()), text.length (), md, &md_len);
+ ans.assign (char_type (md), md_len);
switch (encode) {
case ENC_HEX:
+ ans = hexEncode (ans);
break;
case ENC_BASE64:
- ans.assign (char_type (md), md_len);
ans = base64Encode (ans.begin (), ans.end ());
break;
default:
return newMNode_str (new ustring (ans));
}
+
+/*DOC:
+===md5-file===
+ (md5-file FILENAME [#serial | #named | #static | :serial BOOL | :named BOOL | :static BOOL] [#hex | #base64 | :hex BOOL | :base64 BOOL]) -> STRING
+
+*/
+//#AFUNC md5-file ml_md5_file
+MNode* ml_md5_file (MNode* cell, MlEnv* mlenv) {
+ MNode* arg = cell->cdr ();
+ ustring name;
+ ustring src;
+ StoreType storetype;
+ enum {
+ ENC_HEX,
+ ENC_BASE64,
+ } encode = ENC_HEX;
+ ustring ans;
+ std::vector<MNode*> params;
+ std::vector<MNode*> keywords;
+ static paramList kwlist[] = {
+ {CharConst ("serial"), true},
+ {CharConst ("named"), true},
+ {CharConst ("static"), true},
+ {CharConst ("hex"), true},
+ {CharConst ("base64"), true},
+ {NULL, 0, 0}
+ };
+
+ setParams (arg, 1, ¶ms, kwlist, &keywords, NULL);
+ name = eval_str (params[0], mlenv);
+ if (keywords[0] && eval_bool (keywords[0], mlenv)) // serial
+ storetype.setSerial ();
+ if (keywords[1] && eval_bool (keywords[1], mlenv)) // named
+ storetype.setNamed ();
+ if (keywords[2] && eval_bool (keywords[2], mlenv)) // static
+ storetype.setStatic ();
+ if (keywords[3] && eval_bool (keywords[3], mlenv)) // hex
+ encode = ENC_HEX;
+ if (keywords[4] && eval_bool (keywords[4], mlenv)) // base64
+ encode = ENC_BASE64;
+ src = storetype.src (mlenv, name);
+
+ if (src.length () > 0) {
+ MD5_CTX ctx;
+ FileMacro f;
+ ssize_t len;
+ u_char buf[1024];
+
+ MD5Init (&ctx);
+ if (f.openRead (src.c_str ())) {
+ while ((len = f.read (buf, 1024)) > 0) {
+ MD5Update (&ctx, buf, len);
+ }
+ MD5Final (buf, &ctx);
+ ans.assign (char_type (buf), 16);
+ switch (encode) {
+ case ENC_HEX:
+ ans = hexEncode (ans);
+ break;
+ case ENC_BASE64:
+ ans = base64Encode (ans.begin (), ans.end ());
+ break;
+ default:
+ assert (0);
+ }
+ return newMNode_str (new ustring (ans));
+ }
+ }
+ return NULL;
+}
+
class MlEnv;
MNode* ml_hmac_sha1 (MNode* cell, MlEnv* mlenv);
+MNode* ml_md5_file (MNode* cell, MlEnv* mlenv);
#endif /* ML_SECURITY_H */
}
/*DOC:
-===date-format===
+===date-format, gmdate-format===
(date-format FORMAT INTEGER) -> STRING
+ (gmdate-format FORMAT INTEGER) -> STRING
${Y:4}, ${Y:2}
${M:2}, ${M}
MNode* arg = cell->cdr ();
ustring format;
time_t tm;
+ struct tm tmv;
if (! arg)
throw (uErrorWrongNumber);
if (arg)
throw (uErrorWrongNumber);
- return newMNode_str (new ustring (formatDateString (format, tm)));
+ localtime_r (&tm, &tmv);
+ return newMNode_str (new ustring (formatDateString (format, tmv)));
+}
+
+//#AFUNC gmdate-format ml_gmdate_format
+//#WIKIFUNC gmdate-format
+MNode* ml_gmdate_format (MNode* cell, MlEnv* mlenv) {
+ MNode* arg = cell->cdr ();
+ ustring format;
+ time_t tm;
+ struct tm tmv;
+
+ if (! arg)
+ throw (uErrorWrongNumber);
+ format = eval_str (arg->car (), mlenv);
+ nextNodeNonNil (arg);
+ tm = eval_int (arg->car (), mlenv);
+ nextNode (arg);
+ if (arg)
+ throw (uErrorWrongNumber);
+
+ gmtime_r (&tm, &tmv);
+ return newMNode_str (new ustring (formatDateString (format, tmv)));
}
/*DOC:
MNode* ml_ellipsis (MNode* cell, MlEnv* mlenv);
MNode* ml_string_format (MNode* cell, MlEnv* mlenv);
MNode* ml_date_format (MNode* cell, MlEnv* mlenv);
+MNode* ml_gmdate_format (MNode* cell, MlEnv* mlenv);
MNode* ml_random_key (MNode* cell, MlEnv* mlenv);
MNode* ml_to_string (MNode* cell, MlEnv* mlenv);
MNode* ml_to_sexp (MNode* cell, MlEnv* mlenv);
return ans.release ();
}
-static MNode* dateval4 (struct tm* v) {
+static MNode* dateval7 (struct tm* v) {
MNodeList ans;
ans.append (newMNode_num (v->tm_year + 1900));
ans.append (newMNode_num (v->tm_mon + 1));
ans.append (newMNode_num (v->tm_mday));
ans.append (newMNode_num (v->tm_wday));
+ ans.append (newMNode_num (v->tm_hour));
+ ans.append (newMNode_num (v->tm_min));
+ ans.append (newMNode_num (v->tm_sec));
+
return ans.release ();
}
ans.append (newMNode_num (v->tm_hour));
ans.append (newMNode_num (v->tm_min));
ans.append (newMNode_num (v->tm_sec));
+
return ans.release ();
}
/*DOC:
===to-date4===
- (to-date4 INTEGER) -> (YEAR MONTH DAY WEEK)
+ (to-date4 INTEGER) -> (YEAR MONTH DAY WEEK HOUR MINUTE SECOND)
*/
//#AFUNC to-date4 ml_date4
localtime_r (&tm, &v);
- return dateval4 (&v);
+ return dateval7 (&v);
}
/*DOC:
/*DOC:
===to-gmdate4===
- (to-gmdate4 INTEGER) -> (YEAR MONTH DAY WEEK)
+ (to-gmdate4 INTEGER) -> (YEAR MONTH DAY WEEK HOUR MINUTE SECOND)
*/
//#AFUNC to-gmdate4 ml_gmdate4
gmtime_r (&tm, &v);
- return dateval4 (&v);
+ return dateval7 (&v);
}
/*DOC:
//#MTFUNC date mf_date
void mf_date (const std::vector<ustring>& args, MlEnv* mlenv) {
time_t tm;
+ struct tm tmv;
ustring format;
// boost::ptr_vector<MNodePtr> par;
int i;
}
if (format.length () == 0)
format = uTimeFormat;
- mlenv->env->output->out_toHTML (formatDateString (format, tm));
+ localtime_r (&tm, &tmv);
+ mlenv->env->output->out_toHTML (formatDateString (format, tmv));
}
}
}
WikiMotorObjVecVec::const_iterator e = args->end ();
ustring val;
time_t tm;
+ struct tm tmv;
ustring format;
// boost::ptr_vector<MNodePtr> par;
format = uTimeFormat;
// out->out_toHTML (formatDateString (format, tm));
- out.push_back (WikiMotorObjPtr (new WikiMotorObjText (formatDateString (format, tm))));
+ localtime_r (&tm, &tmv);
+ out.push_back (WikiMotorObjPtr (new WikiMotorObjText (formatDateString (format, tmv))));
}
return true;
}