diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9f10918 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/libcmis-0.5.1.tar.gz diff --git a/.libcmis.metadata b/.libcmis.metadata new file mode 100644 index 0000000..0efb261 --- /dev/null +++ b/.libcmis.metadata @@ -0,0 +1 @@ +94c00715ae8a31bc8e5a6a699e36c22d0020649e SOURCES/libcmis-0.5.1.tar.gz diff --git a/SOURCES/0001-Add-new-Google-Drive-OAuth-2.0-login-procedure.patch b/SOURCES/0001-Add-new-Google-Drive-OAuth-2.0-login-procedure.patch new file mode 100644 index 0000000..810280b --- /dev/null +++ b/SOURCES/0001-Add-new-Google-Drive-OAuth-2.0-login-procedure.patch @@ -0,0 +1,122 @@ +From 32aecffb5517dfc3b3674a8f7db418456bd877ed Mon Sep 17 00:00:00 2001 +From: Giuseppe Castagno +Date: Sat, 30 Apr 2016 14:29:56 +0200 +Subject: [PATCH 1/5] Add new Google Drive OAuth 2.0 login procedure. + +The new Google login sequence uses two html pages: first page for user email +the second page for password. + +The older sequence used only one page for both user email and user password. +--- + src/libcmis/oauth2-providers.cxx | 67 +++++++++++++++++++++++++++++++--------- + 1 file changed, 52 insertions(+), 15 deletions(-) + +diff --git a/src/libcmis/oauth2-providers.cxx b/src/libcmis/oauth2-providers.cxx +index 5e7f3bf..68a6aa5 100644 +--- a/src/libcmis/oauth2-providers.cxx ++++ b/src/libcmis/oauth2-providers.cxx +@@ -37,11 +37,28 @@ using namespace std; + string OAuth2Providers::OAuth2Gdrive( HttpSession* session, const string& authUrl, + const string& username, const string& password ) + { ++ /* This member function implements 'Google OAuth 2.0' ++ * ++ * The interaction is carried out by libcmis, with no web browser involved. ++ * ++ * Normal sequence (without 2FA) is: ++ * 1) a get to activate login page ++ * receive first login page, html format ++ * 2) subsequent post to sent email ++ * receive html page for password input ++ * 3) subsequent post to send password ++ * receive html page for application consent ++ * 4) subsequent post to send a consent for the application ++ * receive a single-use authorization code ++ * this code is returned as a string ++ */ ++ + static const string CONTENT_TYPE( "application/x-www-form-urlencoded" ); + // STEP 1: Log in + string res; + try + { ++ // send the first get, receive the html login page + res = session->httpGetRequest( authUrl )->getStream( )->str( ); + } + catch ( const CurlException& e ) +@@ -49,20 +66,39 @@ string OAuth2Providers::OAuth2Gdrive( HttpSession* session, const string& authUr + return string( ); + } + +- string loginPost, loginLink; +- if ( !parseResponse( res.c_str( ), loginPost, loginLink ) ) ++ string loginEmailPost, loginEmailLink; ++ if ( !parseResponse( res.c_str( ), loginEmailPost, loginEmailLink ) ) + return string( ); +- +- loginPost += "Email="; +- loginPost += string( username ); +- loginPost += "&Passwd="; +- loginPost += string( password ); +- +- istringstream loginIs( loginPost ); +- string loginRes; +- try ++ ++ loginEmailPost += "Email="; ++ loginEmailPost += string( username ); ++ ++ istringstream loginEmailIs( loginEmailPost ); ++ string loginEmailRes; ++ try ++ { ++ // send a post with user email, receive the html page for password input ++ loginEmailRes = session->httpPostRequest ( loginEmailLink, loginEmailIs, CONTENT_TYPE ) ++ ->getStream( )->str( ); ++ } ++ catch ( const CurlException& e ) ++ { ++ return string( ); ++ } ++ ++ string loginPasswdPost, loginPasswdLink; ++ if ( !parseResponse( loginEmailRes.c_str( ), loginPasswdPost, loginPasswdLink ) ) ++ return string( ); ++ ++ loginPasswdPost += "Passwd="; ++ loginPasswdPost += string( password ); ++ ++ istringstream loginPasswdIs( loginPasswdPost ); ++ string loginPasswdRes; ++ try + { +- loginRes = session->httpPostRequest ( loginLink, loginIs, CONTENT_TYPE ) ++ // send a post with user password, receive the application consent page ++ loginPasswdRes = session->httpPostRequest ( loginPasswdLink, loginPasswdIs, CONTENT_TYPE ) + ->getStream( )->str( ); + } + catch ( const CurlException& e ) +@@ -71,8 +107,8 @@ string OAuth2Providers::OAuth2Gdrive( HttpSession* session, const string& authUr + } + + // STEP 2: allow libcmis to access google drive +- string approvalPost, approvalLink; +- if ( !parseResponse( loginRes. c_str( ), approvalPost, approvalLink) ) ++ string approvalPost, approvalLink; ++ if ( !parseResponse( loginPasswdRes. c_str( ), approvalPost, approvalLink) ) + return string( ); + approvalPost += "submit_access=true"; + +@@ -80,7 +116,8 @@ string OAuth2Providers::OAuth2Gdrive( HttpSession* session, const string& authUr + string approvalRes; + try + { +- approvalRes = session->httpPostRequest ( approvalLink, approvalIs, ++ // send a post with application consent ++ approvalRes = session->httpPostRequest ( approvalLink, approvalIs, + CONTENT_TYPE) ->getStream( )->str( ); + } + catch ( const CurlException& e ) +-- +2.7.4 + diff --git a/SOURCES/0001-Properly-encode-OAuth2-credentials.patch b/SOURCES/0001-Properly-encode-OAuth2-credentials.patch new file mode 100644 index 0000000..88a0da6 --- /dev/null +++ b/SOURCES/0001-Properly-encode-OAuth2-credentials.patch @@ -0,0 +1,76 @@ +From 8406c694eb58e610fbf94eba00719e097bad34d8 Mon Sep 17 00:00:00 2001 +From: Stephan Bergmann +Date: Tue, 4 Sep 2018 17:14:21 +0200 +Subject: [PATCH] Properly encode OAuth2 credentials + +Originally created as "Properly +encode OAuth2 credentials". I was not sure which C++ version to target, so kept +it pretty basic. +--- + src/libcmis/oauth2-providers.cxx | 29 +++++++++++++++++++++++++++-- + 1 file changed, 27 insertions(+), 2 deletions(-) + +diff --git a/src/libcmis/oauth2-providers.cxx b/src/libcmis/oauth2-providers.cxx +index dd872dd..c14438f 100644 +--- a/src/libcmis/oauth2-providers.cxx ++++ b/src/libcmis/oauth2-providers.cxx +@@ -26,6 +26,8 @@ + * instead of those above. + */ + ++#include ++ + #include + #include + +@@ -41,6 +43,29 @@ + + using namespace std; + ++namespace { ++ ++// See : ++void addXWwwFormUrlencoded(std::string * buffer, std::string const & data) { ++ assert(buffer); ++ for (string::const_iterator i = data.begin(); i != data.end(); ++i) { ++ unsigned char c = static_cast(*i); ++ if (c == ' ' || c == '*' || c == '-' || c == '.' || (c >= '0' && c <= '9') ++ || (c >= 'A' && c <= 'Z') || c == '_' || (c >= 'a' && c <= 'z')) ++ { ++ *buffer += static_cast(c); ++ } else { ++ static const char hex[16] = { ++ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; ++ *buffer += '%'; ++ *buffer += hex[c >> 4]; ++ *buffer += hex[c & 0xF]; ++ } ++ } ++} ++ ++} ++ + string OAuth2Providers::OAuth2Gdrive( HttpSession* session, const string& authUrl, + const string& username, const string& password ) + { +@@ -93,7 +118,7 @@ string OAuth2Providers::OAuth2Gdrive( HttpSession* session, const string& authUr + return string( ); + + loginEmailPost += "Email="; +- loginEmailPost += string( username ); ++ addXWwwFormUrlencoded(&loginEmailPost, username); + + istringstream loginEmailIs( loginEmailPost ); + string loginEmailRes; +@@ -115,7 +140,7 @@ string OAuth2Providers::OAuth2Gdrive( HttpSession* session, const string& authUr + return string( ); + + loginPasswdPost += "Passwd="; +- loginPasswdPost += string( password ); ++ addXWwwFormUrlencoded(&loginPasswdPost, password); + + istringstream loginPasswdIs( loginPasswdPost ); + string loginPasswdRes; +-- +2.17.1 + diff --git a/SOURCES/0001-do-not-try-to-use-on-an-empty-string.patch b/SOURCES/0001-do-not-try-to-use-on-an-empty-string.patch new file mode 100644 index 0000000..1b55459 --- /dev/null +++ b/SOURCES/0001-do-not-try-to-use-on-an-empty-string.patch @@ -0,0 +1,25 @@ +From ff7ed27039693f91e8348495f3b909c23871123d Mon Sep 17 00:00:00 2001 +From: David Tardon +Date: Thu, 18 Jan 2018 10:42:04 +0100 +Subject: [PATCH 1/2] do not try to use [] on an empty string + +--- + src/libcmis/ws-relatedmultipart.cxx | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/libcmis/ws-relatedmultipart.cxx b/src/libcmis/ws-relatedmultipart.cxx +index 3b31634..675c274 100644 +--- a/src/libcmis/ws-relatedmultipart.cxx ++++ b/src/libcmis/ws-relatedmultipart.cxx +@@ -169,7 +169,7 @@ RelatedMultipart::RelatedMultipart( const string& body, const string& contentTyp + if ( inHeaders ) + { + // Remove potential \r at the end +- if ( line[line.length() - 1] == '\r' ) ++ if ( !line.empty() && line[line.length() - 1] == '\r' ) + line = line.substr( 0, line.length() - 1 ); + + if ( line.empty( ) ) +-- +2.14.3 + diff --git a/SOURCES/0001-rhbz-1410197-limit-the-number-of-redirections.patch b/SOURCES/0001-rhbz-1410197-limit-the-number-of-redirections.patch new file mode 100644 index 0000000..b7d082d --- /dev/null +++ b/SOURCES/0001-rhbz-1410197-limit-the-number-of-redirections.patch @@ -0,0 +1,25 @@ +From 3637a6bbf0a3daf8c11d4290ea47523e3ebeb496 Mon Sep 17 00:00:00 2001 +From: David Tardon +Date: Mon, 27 Feb 2017 19:33:45 +0100 +Subject: [PATCH] rhbz#1410197 limit the number of redirections + +--- + src/libcmis/http-session.cxx | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/src/libcmis/http-session.cxx b/src/libcmis/http-session.cxx +index 943ed5b..5c2f5e9 100644 +--- a/src/libcmis/http-session.cxx ++++ b/src/libcmis/http-session.cxx +@@ -396,6 +396,8 @@ libcmis::HttpResponsePtr HttpSession::httpPostRequest( const string& url, istrea + curl_easy_setopt( m_curlHandle, CURLOPT_HEADERFUNCTION, &lcl_getHeaders ); + curl_easy_setopt( m_curlHandle, CURLOPT_WRITEHEADER, response.get() ); + ++ curl_easy_setopt( m_curlHandle, CURLOPT_MAXREDIRS, 20); ++ + // Get the stream length + is.seekg( 0, ios::end ); + long size = is.tellg( ); +-- +2.9.3 + diff --git a/SOURCES/0001-update-boost.m4-to-fix-version-detection-with-gcc-6..patch b/SOURCES/0001-update-boost.m4-to-fix-version-detection-with-gcc-6..patch new file mode 100644 index 0000000..ef74f90 --- /dev/null +++ b/SOURCES/0001-update-boost.m4-to-fix-version-detection-with-gcc-6..patch @@ -0,0 +1,310 @@ +From 9ffb376c21f7f55fb9237d83f7ea322517f691e2 Mon Sep 17 00:00:00 2001 +From: David Tardon +Date: Thu, 16 Jun 2016 15:03:37 +0200 +Subject: [PATCH] update boost.m4 to fix version detection with gcc 6.1 + +--- + m4/boost.m4 | 176 +++++++++++++++++++++++++++++++++++++++++++++++++++--------- + 1 file changed, 151 insertions(+), 25 deletions(-) + +diff --git a/m4/boost.m4 b/m4/boost.m4 +index a4c366a..2c1df68 100644 +--- a/m4/boost.m4 ++++ b/m4/boost.m4 +@@ -22,7 +22,7 @@ + # along with this program. If not, see . + + m4_define([_BOOST_SERIAL], [m4_translit([ +-# serial 24 ++# serial 26 + ], [# + ], [])]) + +@@ -86,9 +86,10 @@ dnl boost-lib-version = + dnl # 2 "conftest.cc" 3 + dnl "1_56" + dnl +-dnl So get rid of the # lines, and glue the remaining ones together. ++dnl So get rid of the # and empty lines, and glue the remaining ones together. + (eval "$ac_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD | + grep -v '#' | ++ grep -v '^[[[:space:]]]*$' | + tr -d '\r' | + tr -s '\n' ' ' | + $SED -n -e "$1" >conftest.i 2>&1], +@@ -110,7 +111,7 @@ AC_LANG_POP([C++])dnl + # On # success, defines HAVE_BOOST. On failure, calls the optional + # ACTION-IF-NOT-FOUND action if one was supplied. + # Otherwise aborts with an error message. +-AC_DEFUN([BOOST_REQUIRE], ++AC_DEFUN_ONCE([BOOST_REQUIRE], + [AC_REQUIRE([AC_PROG_CXX])dnl + AC_REQUIRE([AC_PROG_GREP])dnl + echo "$as_me: this is boost.m4[]_BOOST_SERIAL" >&AS_MESSAGE_LOG_FD +@@ -548,6 +549,13 @@ BOOST_DEFUN([Asio], + BOOST_FIND_HEADER([boost/asio.hpp])]) + + ++# BOOST_ASSIGN() ++# ------------- ++# Look for Boost.Assign ++BOOST_DEFUN([Assign], ++[BOOST_FIND_HEADER([boost/assign.hpp])]) ++ ++ + # BOOST_BIND() + # ------------ + # Look for Boost.Bind. +@@ -574,7 +582,7 @@ BOOST_FIND_LIB([chrono], [$1], + [boost/chrono.hpp], + [boost::chrono::thread_clock d;]) + if test $enable_static_boost = yes && test $boost_major_version -ge 135; then +- BOOST_FILESYSTEM_LIBS="$BOOST_FILESYSTEM_LIBS $BOOST_SYSTEM_LIBS" ++ BOOST_CHRONO_LIBS="$BOOST_CHRONO_LIBS $BOOST_SYSTEM_LIBS" + fi + LIBS=$boost_filesystem_save_LIBS + LDFLAGS=$boost_filesystem_save_LDFLAGS +@@ -584,27 +592,79 @@ LDFLAGS=$boost_filesystem_save_LDFLAGS + # BOOST_CONTEXT([PREFERRED-RT-OPT]) + # ----------------------------------- + # Look for Boost.Context. For the documentation of PREFERRED-RT-OPT, see the +-# documentation of BOOST_FIND_LIB above. This library was introduced in Boost +-# 1.51.0 ++# documentation of BOOST_FIND_LIB above. ++# ++# * This library was introduced in Boost 1.51.0 ++# * The signatures of make_fcontext() and jump_fcontext were changed in 1.56.0 ++# * A dependency on boost_thread appears in 1.57.0 + BOOST_DEFUN([Context], +-[BOOST_FIND_LIB([context], [$1], ++[boost_context_save_LIBS=$LIBS ++ boost_context_save_LDFLAGS=$LDFLAGS ++if test $boost_major_version -ge 157; then ++ BOOST_THREAD([$1]) ++ m4_pattern_allow([^BOOST_THREAD_(LIBS|LDFLAGS)$])dnl ++ LIBS="$LIBS $BOOST_THREAD_LIBS" ++ LDFLAGS="$LDFLAGS $BOOST_THREAD_LDFLAGS" ++fi ++BOOST_FIND_LIB([context], [$1], + [boost/context/all.hpp],[[ ++ + // creates a stack + void * stack_pointer = new void*[4096]; + std::size_t const size = sizeof(void*[4096]); + +-// context fc uses f() as context function +-// fcontext_t is placed on top of context stack +-// a pointer to fcontext_t is returned ++#if BOOST_VERSION <= 105100 ++ctx::make_fcontext(&fc, f); ++return ctx::jump_fcontext(&fcm, &fc, 3) == 6; ++ ++#else ++ + fc = ctx::make_fcontext(stack_pointer, size, f); +-return ctx::jump_fcontext(&fcm, fc, 3) == 6;]],[dnl ++return ctx::jump_fcontext(&fcm, fc, 3) == 6; ++ ++#endif ++ ++ ++]],[dnl ++ ++#include ++#if BOOST_VERSION <= 105100 ++ ++namespace ctx = boost::ctx; ++ ++static ctx::fcontext_t fcm, fc; ++ ++static void f(intptr_t i) { ++ ctx::jump_fcontext(&fc, &fcm, i * 2); ++} ++ ++#elif BOOST_VERSION <= 105500 ++ + namespace ctx = boost::context; ++ + // context + static ctx::fcontext_t fcm, *fc; ++ + // context-function + static void f(intptr_t i) { + ctx::jump_fcontext(fc, &fcm, i * 2); +-}]) ++} ++ ++#else ++ ++namespace ctx = boost::context; ++ ++// context ++static ctx::fcontext_t fcm, fc; ++ ++// context-function ++static void f(intptr_t i) { ++ ctx::jump_fcontext(&fc, fcm, i * 2); ++} ++#endif ++]) ++LIBS=$boost_context_save_LIBS ++LDFLAGS=$boost_context_save_LDFLAGS + ])# BOOST_CONTEXT + + +@@ -636,10 +696,21 @@ m4_pattern_allow([^BOOST_(CONTEXT|SYSTEM)_(LIBS|LDFLAGS)]) + LIBS="$LIBS $BOOST_CONTEXT_LIBS $BOOST_SYSTEM_LIBS" + LDFLAGS="$LDFLAGS $BOOST_CONTEXT_LDFLAGS" + +-BOOST_FIND_LIB([coroutine], [$1], +- [boost/coroutine/coroutine.hpp], +- [boost::coroutines::coroutine< int(int) > coro; coro.empty();]) +- ++# in 1.53 coroutine was a header only library ++if test $boost_major_version -eq 153; then ++ BOOST_FIND_HEADER([boost/coroutine/coroutine.hpp]) ++else ++ BOOST_FIND_LIB([coroutine], [$1], ++ [boost/coroutine/coroutine.hpp], ++ [ ++ #include ++ #if BOOST_VERSION <= 105500 ++ boost::coroutines::coroutine coro; coro.get(); ++ #else ++ boost::coroutines::asymmetric_coroutine::pull_type coro; coro.get(); ++ #endif ++ ]) ++fi + # Link-time dependency from coroutine to context, existed only in 1.53, in 1.54 + # coroutine doesn't use context from its headers but from its library. + if test $boost_major_version -eq 153 || test $enable_static_boost = yes && test $boost_major_version -ge 154; then +@@ -751,8 +822,19 @@ BOOST_DEFUN([Geometry], + # Look for Boost.Graphs. For the documentation of PREFERRED-RT-OPT, see the + # documentation of BOOST_FIND_LIB above. + BOOST_DEFUN([Graph], +-[BOOST_FIND_LIB([graph], [$1], ++[boost_graph_save_LIBS=$LIBS ++boost_graph_save_LDFLAGS=$LDFLAGS ++# Link-time dependency from graph to regex was added as of 1.40.0. ++if test $boost_major_version -ge 140; then ++ BOOST_REGEX([$1]) ++ m4_pattern_allow([^BOOST_REGEX_(LIBS|LDFLAGS)$])dnl ++ LIBS="$LIBS $BOOST_REGEX_LIBS" ++ LDFLAGS="$LDFLAGS $BOOST_REGEX_LDFLAGS" ++fi ++BOOST_FIND_LIB([graph], [$1], + [boost/graph/adjacency_list.hpp], [boost::adjacency_list<> g;]) ++LIBS=$boost_graph_save_LIBS ++LDFLAGS=$boost_graph_save_LDFLAGS + ])# BOOST_GRAPH + + +@@ -785,9 +867,21 @@ BOOST_DEFUN([Lambda], + # -------------- + # Look for Boost.Locale + BOOST_DEFUN([Locale], +-[BOOST_FIND_LIB([locale], [$1], ++[ ++boost_locale_save_LIBS=$LIBS ++boost_locale_save_LDFLAGS=$LDFLAGS ++# require SYSTEM for boost-1.50.0 and up ++if test $boost_major_version -ge 150; then ++ BOOST_SYSTEM([$1]) ++ m4_pattern_allow([^BOOST_SYSTEM_(LIBS|LDFLAGS)$])dnl ++ LIBS="$LIBS $BOOST_SYSTEM_LIBS" ++ LDFLAGS="$LDFLAGS $BOOST_SYSTEM_LDFLAGS" ++fi # end of the Boost.System check. ++BOOST_FIND_LIB([locale], [$1], + [boost/locale.hpp], + [[boost::locale::generator gen; std::locale::global(gen(""));]]) ++LIBS=$boost_locale_save_LIBS ++LDFLAGS=$boost_locale_save_LDFLAGS + ])# BOOST_LOCALE + + # BOOST_LOG([PREFERRED-RT-OPT]) +@@ -795,9 +889,19 @@ BOOST_DEFUN([Locale], + # Look for Boost.Log. For the documentation of PREFERRED-RT-OPT, see the + # documentation of BOOST_FIND_LIB above. + BOOST_DEFUN([Log], +-[BOOST_FIND_LIB([log], [$1], ++[boost_log_save_LIBS=$LIBS ++boost_log_save_LDFLAGS=$LDFLAGS ++BOOST_SYSTEM([$1]) ++BOOST_FILESYSTEM([$1]) ++BOOST_DATE_TIME([$1]) ++m4_pattern_allow([^BOOST_(SYSTEM|FILESYSTEM|DATE_TIME)_(LIBS|LDFLAGS)$])dnl ++LIBS="$LIBS $BOOST_DATE_TIME_LIBS $BOOST_FILESYSTEM_LIBS $BOOST_SYSTEM_LIBS" ++LDFLAGS="$LDFLAGS $BOOST_DATE_TIME_LDFLAGS $BOOST_FILESYSTEM_LDFLAGS $BOOST_SYSTEM_LDFLAGS" ++BOOST_FIND_LIB([log], [$1], + [boost/log/core/core.hpp], + [boost::log::attribute a; a.get_value();]) ++LIBS=$boost_log_save_LIBS ++LDFLAGS=$boost_log_save_LDFLAGS + ])# BOOST_LOG + + +@@ -806,10 +910,17 @@ BOOST_DEFUN([Log], + # Look for Boost.Log. For the documentation of PREFERRED-RT-OPT, see the + # documentation of BOOST_FIND_LIB above. + BOOST_DEFUN([Log_Setup], +-[AC_REQUIRE([BOOST_LOG])dnl ++[boost_log_setup_save_LIBS=$LIBS ++boost_log_setup_save_LDFLAGS=$LDFLAGS ++BOOST_LOG([$1]) ++m4_pattern_allow([^BOOST_LOG_(LIBS|LDFLAGS)$])dnl ++LIBS="$LIBS $BOOST_LOG_LIBS" ++LDFLAGS="$LDFLAGS $BOOST_LOG_LDFLAGS" + BOOST_FIND_LIB([log_setup], [$1], + [boost/log/utility/setup/from_settings.hpp], + [boost::log::basic_settings bs; bs.empty();]) ++LIBS=$boost_log_setup_save_LIBS ++LDFLAGS=$boost_log_setup_save_LDFLAGS + ])# BOOST_LOG_SETUP + + +@@ -1067,15 +1178,24 @@ LDFLAGS="$LDFLAGS $BOOST_SYSTEM_LDFLAGS" + CPPFLAGS="$CPPFLAGS $boost_cv_pthread_flag" + + # When compiling for the Windows platform, the threads library is named +-# differently. +-case $host_os in +- (*mingw*) boost_thread_lib_ext=_win32;; +-esac ++# differently. This suffix doesn't exist in new versions of Boost, or ++# possibly new versions of GCC on mingw I am assuming it's Boost's change for ++# now and I am setting version to 1.48, for lack of knowledge as to when this ++# change occurred. ++if test $boost_major_version -lt 148; then ++ case $host_os in ++ (*mingw*) boost_thread_lib_ext=_win32;; ++ esac ++fi + BOOST_FIND_LIBS([thread], [thread$boost_thread_lib_ext], + [$1], + [boost/thread.hpp], [boost::thread t; boost::mutex m;]) + +-BOOST_THREAD_LIBS="$BOOST_THREAD_LIBS $BOOST_SYSTEM_LIBS $boost_cv_pthread_flag" ++case $host_os in ++ (*mingw*) boost_thread_w32_socket_link=-lws2_32;; ++esac ++ ++BOOST_THREAD_LIBS="$BOOST_THREAD_LIBS $BOOST_SYSTEM_LIBS $boost_cv_pthread_flag $boost_thread_w32_socket_link" + BOOST_THREAD_LDFLAGS="$BOOST_SYSTEM_LDFLAGS" + BOOST_CPPFLAGS="$BOOST_CPPFLAGS $boost_cv_pthread_flag" + LIBS=$boost_thread_save_LIBS +@@ -1296,6 +1416,12 @@ if test x$boost_cv_inc_path != xno; then + # I'm not sure about my test for `il' (be careful: Intel's ICC pre-defines + # the same defines as GCC's). + for i in \ ++ _BOOST_mingw_test(5, 3) \ ++ _BOOST_gcc_test(5, 3) \ ++ _BOOST_mingw_test(5, 2) \ ++ _BOOST_gcc_test(5, 2) \ ++ _BOOST_mingw_test(5, 1) \ ++ _BOOST_gcc_test(5, 1) \ + _BOOST_mingw_test(5, 0) \ + _BOOST_gcc_test(5, 0) \ + _BOOST_mingw_test(4, 10) \ +-- +2.7.4 + diff --git a/SOURCES/0002-Add-new-mokup-login-pages.patch b/SOURCES/0002-Add-new-mokup-login-pages.patch new file mode 100644 index 0000000..32aab37 --- /dev/null +++ b/SOURCES/0002-Add-new-mokup-login-pages.patch @@ -0,0 +1,70 @@ +From 0490c023cd14cbb3d1ba2bc1b648b216f848a648 Mon Sep 17 00:00:00 2001 +From: Giuseppe Castagno +Date: Tue, 3 May 2016 08:35:57 +0200 +Subject: [PATCH 2/5] Add new mokup login pages + +--- + qa/libcmis/data/gdrive/login.html | 12 ------------ + qa/libcmis/data/gdrive/login1.html | 12 ++++++++++++ + qa/libcmis/data/gdrive/login2.html | 11 +++++++++++ + 3 files changed, 23 insertions(+), 12 deletions(-) + delete mode 100644 qa/libcmis/data/gdrive/login.html + create mode 100644 qa/libcmis/data/gdrive/login1.html + create mode 100644 qa/libcmis/data/gdrive/login2.html + +diff --git a/qa/libcmis/data/gdrive/login.html b/qa/libcmis/data/gdrive/login.html +deleted file mode 100644 +index eae53bf..0000000 +--- a/qa/libcmis/data/gdrive/login.html ++++ /dev/null +@@ -1,12 +0,0 @@ +- +- +- +-
+- +- +- +- +- +-
+- +- +diff --git a/qa/libcmis/data/gdrive/login1.html b/qa/libcmis/data/gdrive/login1.html +new file mode 100644 +index 0000000..eae53bf +--- /dev/null ++++ b/qa/libcmis/data/gdrive/login1.html +@@ -0,0 +1,12 @@ ++ ++ ++ ++
++ ++ ++ ++ ++ ++
++ ++ +diff --git a/qa/libcmis/data/gdrive/login2.html b/qa/libcmis/data/gdrive/login2.html +new file mode 100644 +index 0000000..198f816 +--- /dev/null ++++ b/qa/libcmis/data/gdrive/login2.html +@@ -0,0 +1,11 @@ ++ ++ ++ ++
++ ++ ++ ++ ++
++ ++ +-- +2.7.4 + diff --git a/SOURCES/0002-return-early-if-the-time-part-is-empty.patch b/SOURCES/0002-return-early-if-the-time-part-is-empty.patch new file mode 100644 index 0000000..370b061 --- /dev/null +++ b/SOURCES/0002-return-early-if-the-time-part-is-empty.patch @@ -0,0 +1,25 @@ +From 738528d790b2b1d52d9b72d673842969a852815d Mon Sep 17 00:00:00 2001 +From: David Tardon +Date: Thu, 18 Jan 2018 10:48:52 +0100 +Subject: [PATCH 2/2] return early if the time part is empty + +--- + src/libcmis/xml-utils.cxx | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/libcmis/xml-utils.cxx b/src/libcmis/xml-utils.cxx +index d20ff47..6363af8 100644 +--- a/src/libcmis/xml-utils.cxx ++++ b/src/libcmis/xml-utils.cxx +@@ -385,5 +385,8 @@ namespace libcmis + + size_t teePos = dateTimeStr.find( 'T' ); ++ if ( teePos == string::npos || teePos == dateTimeStr.size() - 1 ) ++ return t; // obviously not a time ++ + string noTzStr = dateTimeStr.substr( 0, teePos + 1 ); + + string timeStr = dateTimeStr.substr( teePos + 1 ); +-- +2.14.3 + diff --git a/SOURCES/0003-Fix-test-in-test-factory.patch b/SOURCES/0003-Fix-test-in-test-factory.patch new file mode 100644 index 0000000..509a968 --- /dev/null +++ b/SOURCES/0003-Fix-test-in-test-factory.patch @@ -0,0 +1,113 @@ +From 04297298ad9659c949beb7ccd0f75cfd440a4fb8 Mon Sep 17 00:00:00 2001 +From: Giuseppe Castagno +Date: Tue, 3 May 2016 11:47:43 +0200 +Subject: [PATCH 3/5] Fix test in test-factory + +--- + qa/libcmis/data/gdrive/login1.html | 4 ++-- + qa/libcmis/data/gdrive/login2.html | 2 +- + qa/libcmis/test-factory.cxx | 10 ++++++++-- + qa/mockup/mockup-config.cxx | 3 +++ + qa/mockup/mockup-config.h | 6 +++--- + 5 files changed, 17 insertions(+), 8 deletions(-) + +diff --git a/qa/libcmis/data/gdrive/login1.html b/qa/libcmis/data/gdrive/login1.html +index eae53bf..b6da338 100644 +--- a/qa/libcmis/data/gdrive/login1.html ++++ b/qa/libcmis/data/gdrive/login1.html +@@ -1,12 +1,12 @@ + + + +-
++ ++ + + + + +- +
+ + +diff --git a/qa/libcmis/data/gdrive/login2.html b/qa/libcmis/data/gdrive/login2.html +index 198f816..6425091 100644 +--- a/qa/libcmis/data/gdrive/login2.html ++++ b/qa/libcmis/data/gdrive/login2.html +@@ -1,7 +1,7 @@ + + + +-
++ + + + +diff --git a/qa/libcmis/test-factory.cxx b/qa/libcmis/test-factory.cxx +index c0bcb4c..3779e5a 100644 +--- a/qa/libcmis/test-factory.cxx ++++ b/qa/libcmis/test-factory.cxx +@@ -64,6 +64,7 @@ + + #define GDRIVE_AUTH_URL string ( "https://auth/url" ) + #define GDRIVE_LOGIN_URL string ("https://login/url" ) ++#define GDRIVE_LOGIN_URL2 string ("https://login2/url" ) + #define GDRIVE_APPROVAL_URL string ("https://approval/url" ) + #define GDRIVE_TOKEN_URL string ( "https://token/url" ) + +@@ -101,10 +102,15 @@ namespace + string("&redirect_uri=") + OAUTH_REDIRECT_URI + + string("&response_type=code") + + string("&client_id=") + OAUTH_CLIENT_ID; ++ + curl_mockup_addResponse ( GDRIVE_AUTH_URL.c_str(), loginIdentifier.c_str( ), +- "GET", DATA_DIR "/gdrive/login.html", 200, true); ++ "GET", DATA_DIR "/gdrive/login1.html", 200, true); ++ ++ //authentication email ++ curl_mockup_addResponse( GDRIVE_LOGIN_URL2.c_str( ), "", "POST", ++ DATA_DIR "/gdrive/login2.html", 200, true); + +- //authentication response ++ //authentication password, + curl_mockup_addResponse( GDRIVE_LOGIN_URL.c_str( ), "", "POST", + DATA_DIR "/gdrive/approve.html", 200, true); + +diff --git a/qa/mockup/mockup-config.cxx b/qa/mockup/mockup-config.cxx +index f6b84ad..fb19927 100644 +--- a/qa/mockup/mockup-config.cxx ++++ b/qa/mockup/mockup-config.cxx +@@ -117,6 +117,9 @@ namespace mockup + return !m_username.empty( ) && !m_password.empty( ); + } + ++ /** Find a suitable response ++ * using the request as a search key ++ */ + CURLcode Configuration::writeResponse( CurlHandle* handle ) + { + CURLcode code = CURLE_OK; +diff --git a/qa/mockup/mockup-config.h b/qa/mockup/mockup-config.h +index 6b94706..d0fc3bb 100644 +--- a/qa/mockup/mockup-config.h ++++ b/qa/mockup/mockup-config.h +@@ -41,13 +41,13 @@ void curl_mockup_reset( ); + the base URL of the request without parameters + \param matchParam + a string to find in the parameters part of the URL to match ++ \param method ++ HTTP method to match like PUT, GET, POST or DELETE. An empty ++ string matches any method. + \param response + a string corresponding either to the file path of the request + body to send or directly the content to send. This value has + a different meaning depending on isFilePath parameter. +- \param method +- HTTP method to match like PUT, GET, POST or DELETE. An empty +- string matches any method. + \param status + the HTTP status to return. 0 means HTTP OK (200). + \param isFilePath +-- +2.7.4 + diff --git a/SOURCES/0004-Fix-test-in-test-gdrive.patch b/SOURCES/0004-Fix-test-in-test-gdrive.patch new file mode 100644 index 0000000..899148a --- /dev/null +++ b/SOURCES/0004-Fix-test-in-test-gdrive.patch @@ -0,0 +1,74 @@ +From 73662089059eb2e272a4c5eb245a497af044ccf6 Mon Sep 17 00:00:00 2001 +From: Giuseppe Castagno +Date: Tue, 3 May 2016 15:35:57 +0200 +Subject: [PATCH 4/5] Fix test in test-gdrive + +--- + qa/libcmis/test-gdrive.cxx | 32 ++++++++++++++++++++++++-------- + 1 file changed, 24 insertions(+), 8 deletions(-) + +diff --git a/qa/libcmis/test-gdrive.cxx b/qa/libcmis/test-gdrive.cxx +index 0cd9577..6323099 100644 +--- a/qa/libcmis/test-gdrive.cxx ++++ b/qa/libcmis/test-gdrive.cxx +@@ -51,6 +51,7 @@ static const string CLIENT_SECRET ( "mock-secret" ); + static const string USERNAME( "mock-user" ); + static const string PASSWORD( "mock-password" ); + static const string LOGIN_URL ("https://login/url" ); ++static const string LOGIN_URL2 ("https://login2/url" ); + static const string APPROVAL_URL ("https://approval/url" ); + static const string AUTH_URL ( "https://auth/url" ); + static const string TOKEN_URL ( "https://token/url" ); +@@ -149,10 +150,15 @@ GDriveSession GDriveTest::getTestSession( string username, string password ) + string("&redirect_uri=") + REDIRECT_URI + + string("&response_type=code") + + string("&client_id=") + CLIENT_ID; ++ + curl_mockup_addResponse ( AUTH_URL.c_str(), loginIdentifier.c_str( ), +- "GET", DATA_DIR "/gdrive/login.html", 200, true); ++ "GET", DATA_DIR "/gdrive/login1.html", 200, true); ++ ++ //authentication email ++ curl_mockup_addResponse( LOGIN_URL2.c_str( ), empty.c_str( ), "POST", ++ DATA_DIR "/gdrive/login2.html", 200, true); + +- //authentication response ++ //authentication password, + curl_mockup_addResponse( LOGIN_URL.c_str( ), empty.c_str( ), "POST", + DATA_DIR "/gdrive/approve.html", 200, true); + +@@ -171,15 +177,25 @@ void GDriveTest::sessionAuthenticationTest( ) + GDriveSession session = getTestSession( USERNAME, PASSWORD ); + string empty; + +- // Check authentication request +- string authRequest( curl_mockup_getRequestBody( LOGIN_URL.c_str(), empty.c_str( ), ++ // Check authentication request for email ++ string authRequestEmail( curl_mockup_getRequestBody( LOGIN_URL2.c_str(), empty.c_str( ), ++ "POST" ) ); ++ string expectedAuthRequestEmail = ++ string ( "Page=PasswordSeparationSignIn&continue=redirectLink&scope=Scope&service=lso&GALX=cookie" ++ "&Email=") + USERNAME; ++ ++ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Wrong authentication request for Email", ++ expectedAuthRequestEmail, authRequestEmail ); ++ ++ // Check authentication request for password ++ string authRequestPassword( curl_mockup_getRequestBody( LOGIN_URL.c_str(), empty.c_str( ), + "POST" ) ); +- string expectedAuthRequest = ++ string expectedAuthRequestPassword = + string ( "continue=redirectLink&scope=Scope&service=lso&GALX=cookie" +- "&Email=") + USERNAME + string("&Passwd=") + PASSWORD; ++ "&Passwd=") + PASSWORD; + +- CPPUNIT_ASSERT_EQUAL_MESSAGE( "Wrong authentication request", +- expectedAuthRequest, authRequest ); ++ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Wrong authentication request for Password", ++ expectedAuthRequestPassword, authRequestPassword ); + + // Check code request + string codeRequest( curl_mockup_getRequestBody( APPROVAL_URL.c_str(), +-- +2.7.4 + diff --git a/SOURCES/0005-Fix-test-in-test-onedrive.patch b/SOURCES/0005-Fix-test-in-test-onedrive.patch new file mode 100644 index 0000000..c2dc0f0 --- /dev/null +++ b/SOURCES/0005-Fix-test-in-test-onedrive.patch @@ -0,0 +1,42 @@ +From 3ebc3d9fe6a9806de2bcdf79ac6398f0c14c3246 Mon Sep 17 00:00:00 2001 +From: Giuseppe Castagno +Date: Tue, 3 May 2016 15:41:52 +0200 +Subject: [PATCH 5/5] Fix test in test-onedrive + +--- + qa/libcmis/test-onedrive.cxx | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +diff --git a/qa/libcmis/test-onedrive.cxx b/qa/libcmis/test-onedrive.cxx +index b88751b..5da8918 100644 +--- a/qa/libcmis/test-onedrive.cxx ++++ b/qa/libcmis/test-onedrive.cxx +@@ -51,6 +51,7 @@ static const string CLIENT_SECRET ( "mock-secret" ); + static const string USERNAME( "mock-user" ); + static const string PASSWORD( "mock-password" ); + static const string LOGIN_URL ("https://login/url" ); ++static const string LOGIN_URL2 ("https://login2/url" ); + static const string APPROVAL_URL ("https://approval/url" ); + static const string AUTH_URL ( "https://auth/url" ); + static const string TOKEN_URL ( "https://token/url" ); +@@ -123,10 +124,15 @@ OneDriveSession OneDriveTest::getTestSession( string username, string password ) + string("&redirect_uri=") + REDIRECT_URI + + string("&response_type=code") + + string("&client_id=") + CLIENT_ID; ++ + curl_mockup_addResponse ( AUTH_URL.c_str(), loginIdentifier.c_str( ), +- "GET", DATA_DIR "/gdrive/login.html", 200, true); ++ "GET", DATA_DIR "/gdrive/login1.html", 200, true); ++ ++ //authentication email ++ curl_mockup_addResponse( LOGIN_URL2.c_str( ), empty.c_str( ), "POST", ++ DATA_DIR "/gdrive/login2.html", 200, true); + +- //authentication response ++ //authentication password + curl_mockup_addResponse( LOGIN_URL.c_str( ), empty.c_str( ), "POST", + DATA_DIR "/gdrive/approve.html", 200, true); + +-- +2.7.4 + diff --git a/SPECS/libcmis.spec b/SPECS/libcmis.spec new file mode 100644 index 0000000..4821296 --- /dev/null +++ b/SPECS/libcmis.spec @@ -0,0 +1,261 @@ +%global apiversion 0.5 + +Name: libcmis +Version: 0.5.1 +Release: 13%{?dist} +Summary: A C/C++ client library for CM interfaces + +License: GPLv2+ or LGPLv2+ or MPLv1.1 +URL: https://github.com/tdf/libcmis +Source: https://github.com/tdf/libcmis/releases/download/v%{version}/%{name}-%{version}.tar.gz + +BuildRequires: autoconf +BuildRequires: automake +BuildRequires: boost-devel +BuildRequires: pkgconfig(cppunit) +BuildRequires: pkgconfig(libcurl) +BuildRequires: pkgconfig(libxml-2.0) +BuildRequires: xmlto + +Patch0: 0001-Add-new-Google-Drive-OAuth-2.0-login-procedure.patch +Patch1: 0002-Add-new-mokup-login-pages.patch +Patch2: 0003-Fix-test-in-test-factory.patch +Patch3: 0004-Fix-test-in-test-gdrive.patch +Patch4: 0005-Fix-test-in-test-onedrive.patch +Patch5: 0001-update-boost.m4-to-fix-version-detection-with-gcc-6..patch +Patch6: 0001-rhbz-1410197-limit-the-number-of-redirections.patch +Patch7: 0001-do-not-try-to-use-on-an-empty-string.patch +Patch8: 0002-return-early-if-the-time-part-is-empty.patch +Patch9: 0001-Properly-encode-OAuth2-credentials.patch + +%description +LibCMIS is a C/C++ client library for working with CM (content management) +interfaces. The primary supported interface (which gave the library its +name) is CMIS, which allows applications to connect to any ECM behaving +as a CMIS server (Alfresco or Nuxeo are examples of open source ones). +Another supported interface is Google Drive. + +%package devel +Summary: Development files for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} + +%description devel +The %{name}-devel package contains libraries and header files for +developing applications that use %{name}. + +%package tools +Summary: Command line tool to access CMIS +Requires: %{name}%{?_isa} = %{version}-%{release} + +%description tools +The %{name}-tools package contains a tool for accessing CMIS from the +command line. + +%prep +%autosetup -p1 + +%build +aclocal -I m4 +autoconf +%configure --disable-silent-rules --disable-static --disable-werror \ + DOCBOOK2MAN='xmlto man' +sed -i \ + -e 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' \ + -e 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' \ + libtool +make %{?_smp_mflags} + +%install +make install DESTDIR=%{buildroot} +rm -f %{buildroot}/%{_libdir}/*.la + +%post -p /sbin/ldconfig +%postun -p /sbin/ldconfig + +%check +export LD_LIBRARY_PATH=%{buildroot}/%{_libdir}${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}} +make %{?_smp_mflags} check + +%files +%doc AUTHORS NEWS +%license COPYING.* +%{_libdir}/%{name}-%{apiversion}.so.* +%{_libdir}/%{name}-c-%{apiversion}.so.* + +%files devel +%doc ChangeLog +%{_includedir}/%{name}-%{apiversion} +%{_includedir}/%{name}-c-%{apiversion} +%{_libdir}/%{name}-%{apiversion}.so +%{_libdir}/%{name}-c-%{apiversion}.so +%{_libdir}/pkgconfig/%{name}-%{apiversion}.pc +%{_libdir}/pkgconfig/%{name}-c-%{apiversion}.pc + +%files tools +%{_bindir}/cmis-client +%{_mandir}/man1/cmis-client.1* + +%changelog +* Wed Nov 07 2018 Stephan Bergmann - 0.5.1-13 +- Resolves: rhbz#1647470 fix Google Drive login + +* Thu Aug 02 2018 Caolán McNamara - 0.5.1-12 +- Related: rhbz#1611082 rebuild i686 + +* Wed Feb 07 2018 Fedora Release Engineering - 0.5.1-11 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Tue Jan 23 2018 Jonathan Wakely - 0.5.1-10 +- Rebuilt for Boost 1.66 + +* Thu Aug 03 2017 Fedora Release Engineering - 0.5.1-9 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Wed Jul 26 2017 Fedora Release Engineering - 0.5.1-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Mon Jul 03 2017 Jonathan Wakely - 0.5.1-7 +- Rebuilt for Boost 1.64 + +* Mon May 15 2017 Fedora Release Engineering - 0.5.1-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_27_Mass_Rebuild + +* Mon Feb 27 2017 David Tardon - 0.5.1-5 +- Resolves: rhbz#1410197 work around infinite redirection loop + +* Fri Feb 10 2017 Fedora Release Engineering - 0.5.1-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Fri Jan 27 2017 Jonathan Wakely - 0.5.1-3 +- Rebuilt for Boost 1.63 + +* Wed May 04 2016 David Tardon - 0.5.1-2 +- fix Google Drive login + +* Fri Mar 04 2016 David Tardon - 0.5.1-1 +- new upstream release + +* Wed Mar 02 2016 David Tardon - 0.5.0-12 +- add a bunch of fixes for problems found by coverity + +* Thu Feb 04 2016 Fedora Release Engineering - 0.5.0-11 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Fri Jan 15 2016 Jonathan Wakely - 0.5.0-10 +- Rebuilt for Boost 1.60 + +* Wed Sep 02 2015 Jonathan Wakely 0.5.0-9 +- Patched and rebuilt for Boost 1.59 + +* Wed Jul 29 2015 Fedora Release Engineering - 0.5.0-8 +- Rebuilt for https://fedoraproject.org/wiki/Changes/F23Boost159 + +* Fri Jul 24 2015 Adam Williamson - 0.5.0-7 +- rebuild for Boost 1.58 (for f23, for real this time) + +* Wed Jul 22 2015 David Tardon - 0.5.0-6 +- rebuild for Boost 1.58 + +* Wed Jun 17 2015 Fedora Release Engineering - 0.5.0-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Sun Apr 12 2015 David Tardon - 0.5.0-4 +- rebuild for yet another C++ ABI break + +* Fri Feb 20 2015 David Tardon - 0.5.0-3 +- rebuild for C++ stdlib ABI change in gcc5 + +* Tue Jan 27 2015 Petr Machata - 0.5.0-2 +- Rebuild for boost 1.57.0 + +* Sun Dec 21 2014 David Tardon - 0.5.0-1 +- new upstream release + +* Fri Sep 05 2014 David Tardon - 0.4.1-8 +- coverity: fix mismatching exceptions + +* Thu Sep 04 2014 David Tardon - 0.4.1-7 +- a few use-after-free fixes for the C wrapper + +* Sun Aug 17 2014 Fedora Release Engineering - 0.4.1-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Sat Jun 07 2014 Fedora Release Engineering - 0.4.1-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Fri May 23 2014 Petr Machata - 0.4.1-4 +- Rebuild for boost 1.55.0 + +* Fri Feb 28 2014 David Tardon - 0.4.1-3 +- Resolves: rhbz#1070691 test failing on big endians + +* Thu Nov 21 2013 David Tardon - 0.4.1-2 +- disable tests on arm + +* Wed Nov 06 2013 David Tardon - 0.4.1-1 +- new upstream release + +* Fri Aug 30 2013 David Tardon - 0.3.1-8 +- Resolves: rhbz#1000819 pkgconfig file for libcmis-c is broken + +* Sat Aug 03 2013 Fedora Release Engineering - 0.3.1-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Sat Jul 27 2013 pmachata@redhat.com - 0.3.1-6 +- Rebuild for boost 1.54.0 + +* Wed Apr 24 2013 David Tardon - 0.3.1-5 +- Resolves: rhbz#918079 libcmis::sha1() can return digests with fewer + than 40 hexadecimal digits +- Resolves: rhbz#918080 restrict redirection protocols + +* Mon Apr 08 2013 David Tardon - 0.3.1-4 +- Resolves: rhbz#918044 memory leaks on exception path in C wrapper + +* Sun Feb 10 2013 Denis Arnaud - 0.3.1-3 +- Rebuild for Boost-1.53.0 + +* Sat Feb 09 2013 Denis Arnaud - 0.3.1-2 +- Rebuild for Boost-1.53.0 + +* Mon Feb 04 2013 David Tardon - 0.3.1-1 +- new release + +* Wed Dec 19 2012 David Tardon - 0.3.0-6 +- use xmlto for generating man page + +* Sat Dec 08 2012 David Tardon - 0.3.0-5 +- another pointless bump + +* Fri Dec 07 2012 David Tardon - 0.3.0-4 +- another pointless rebuild + +* Fri Dec 07 2012 David Tardon - 0.3.0-3 +- pointless rebuild + +* Fri Dec 07 2012 David Tardon - 0.3.0-2 +- force rebuild + +* Thu Dec 06 2012 David Tardon - 0.3.0-1 +- new upstream release + +* Tue Nov 06 2012 Caolán McNamara - 0.2.3-4 +- clarify license + +* Fri Jul 27 2012 David Tardon - 0.2.3-3 +- rebuilt for boost 1.50 + +* Thu Jul 19 2012 Fedora Release Engineering - 0.2.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Thu Jun 28 2012 David Tardon - 0.2.3-1 +- new upstream version + +* Wed Jun 20 2012 David Tardon - 0.2.2-1 +- latest upstream version + +* Tue Feb 28 2012 Fedora Release Engineering - 0.1.0-2 +- Rebuilt for c++ ABI breakage + +* Wed Dec 21 2011 David Tardon 0.1.0-1 +- initial import