mirror of
https://github.com/IT4Change/gradido.git
synced 2025-12-13 07:45:54 +00:00
adding files from other projects, adding http interface pages
This commit is contained in:
parent
866b4faedb
commit
86a83e3e00
@ -11,12 +11,17 @@ include_directories(
|
|||||||
)
|
)
|
||||||
|
|
||||||
FILE(GLOB TINF "dependencies/tinf/src/*.c" "dependencies/tinf/src/*.h")
|
FILE(GLOB TINF "dependencies/tinf/src/*.c" "dependencies/tinf/src/*.h")
|
||||||
SET(LOCAL_SRCS ${TINF})
|
FILE(GLOB HTTPInterface "src/cpp/HTTPInterface/*.h" "src/cpp/HTTPInterface/*.cpp")
|
||||||
|
FILE(GLOB CRYPTO "src/cpp/Crypto/*.h" "src/cpp/Crypto/*.cpp")
|
||||||
|
FILE(GLOB MAIN "src/cpp/*.cpp" "src/cpp/*.c" "src/cpp/*.h")
|
||||||
|
SET(LOCAL_SRCS ${TINF} ${MAIN} ${HTTPInterface} ${CRYPTO})
|
||||||
aux_source_directory("src/cpp" LOCAL_SRCS)
|
aux_source_directory("src/cpp" LOCAL_SRCS)
|
||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
# src
|
# src
|
||||||
source_group("tinf" FILES ${TINF})
|
source_group("tinf" FILES ${TINF})
|
||||||
|
source_group("crypto" FILES ${CRYPTO})
|
||||||
|
source_group("HTTP-Interface" FILES ${HTTPInterface})
|
||||||
|
|
||||||
endif(MSVC)
|
endif(MSVC)
|
||||||
|
|
||||||
|
|||||||
134
src/cpp/Crypto/DRHash.h
Normal file
134
src/cpp/Crypto/DRHash.h
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
/*/*************************************************************************
|
||||||
|
* *
|
||||||
|
* Core, Core-Lib for my programs, Core doesn't need any libraries *
|
||||||
|
* Copyright (C) 2012, 2013, 2014 Dario Rekowski *
|
||||||
|
* Email: ***REMOVED*** Web: ***REMOVED*** *
|
||||||
|
* *
|
||||||
|
* This program is free software: you can redistribute it and/or modify *
|
||||||
|
* it under the terms of the GNU General Public License as published by *
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or *
|
||||||
|
* any later version. *
|
||||||
|
* *
|
||||||
|
* This program 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 General Public License for more details. *
|
||||||
|
* *
|
||||||
|
* You should have received a copy of the GNU General Public License *
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
|
||||||
|
* *
|
||||||
|
***************************************************************************/
|
||||||
|
//---------------------------------------------------------
|
||||||
|
// hashing header file
|
||||||
|
// aus dem Buch "Goldene Regeln der Spieleprogrammierung" von Martin Brownlow
|
||||||
|
//---------------------------------------------------------
|
||||||
|
#ifndef __DR_CORE2_HASH__
|
||||||
|
#define __DR_CORE2_HASH__
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
typedef unsigned int HASH;
|
||||||
|
typedef unsigned long DHASH;
|
||||||
|
|
||||||
|
#ifndef u32
|
||||||
|
typedef unsigned long u32;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef s32
|
||||||
|
typedef long s32;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//---------------------------------------------------------
|
||||||
|
// sample hash creation functions
|
||||||
|
//---------------------------------------------------------
|
||||||
|
inline HASH DRHashRotateLeft( HASH hash, const unsigned int rotateBy )
|
||||||
|
{
|
||||||
|
return (hash<<rotateBy)|(hash>>(32-rotateBy));
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------
|
||||||
|
// create a hash from a string
|
||||||
|
//---------------------------------------------------------
|
||||||
|
inline HASH DRMakeStringHash( const char *pString )
|
||||||
|
{
|
||||||
|
HASH ret = 0;
|
||||||
|
char c;
|
||||||
|
|
||||||
|
if( pString )
|
||||||
|
{
|
||||||
|
while( (c=*(pString++)) != '\0' )
|
||||||
|
ret = DRHashRotateLeft(ret,7) + c;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline HASH DRMakeStringHash(const char *pString, unsigned int str_size)
|
||||||
|
{
|
||||||
|
HASH ret = 0;
|
||||||
|
|
||||||
|
if (pString)
|
||||||
|
{
|
||||||
|
for (unsigned int i = 0; i < str_size; i++) {
|
||||||
|
ret = DRHashRotateLeft(ret, 7) + pString[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------
|
||||||
|
// create a hash from a filename
|
||||||
|
//---------------------------------------------------------
|
||||||
|
inline HASH DRMakeFilenameHash( const char *pString )
|
||||||
|
{
|
||||||
|
HASH ret = 0;
|
||||||
|
char c;
|
||||||
|
|
||||||
|
if( pString )
|
||||||
|
{
|
||||||
|
while( (c=*(pString++)) != '\0' )
|
||||||
|
{
|
||||||
|
if( c>='A' && c<='Z' )
|
||||||
|
c ^= 32;
|
||||||
|
else if( c=='/' )
|
||||||
|
c = '\\';
|
||||||
|
ret = DRHashRotateLeft(ret,7) + c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------------
|
||||||
|
//einen Hash aus zwei Werten erstellen
|
||||||
|
inline DHASH DRMakeDoubleHash(const char* pTypeName, const char* pFileName)
|
||||||
|
{
|
||||||
|
HASH hTemp1 = DRMakeStringHash(pTypeName);
|
||||||
|
DHASH hTemp2 = DRMakeFilenameHash(pFileName);
|
||||||
|
hTemp2 = hTemp2 << 16;
|
||||||
|
return ((DHASH)(hTemp1)|(DHASH)(hTemp2));
|
||||||
|
}
|
||||||
|
//einen Hash aus 3 Int-Werten generiren
|
||||||
|
inline DHASH DRMakeThreeIntHash(int i1, int i2, int i3)
|
||||||
|
{
|
||||||
|
DHASH h1 = DRHashRotateLeft(i1, 24);
|
||||||
|
h1 = h1 | DRHashRotateLeft(i2, 16);
|
||||||
|
return h1 | i3;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
//ein hash aus einem Vector2D
|
||||||
|
inline CORE2_API DHASH DRMakeVector2Hash(DRVector2 vVector)
|
||||||
|
{
|
||||||
|
DHASH h1 = DRHashRotateLeft((int)vVector.x, 16);
|
||||||
|
return h1 | (int)vVector.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
//ein hash aus einem Vector3D
|
||||||
|
inline CORE2_API DHASH DRMakeVector3Hash(DRVector3 vector)
|
||||||
|
{
|
||||||
|
return DRMakeThreeIntHash((int)vector.x, (int)vector.y, (int)vector.z);
|
||||||
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
#endif //__DR_CORE2_HASH__
|
||||||
282
src/cpp/Crypto/DRHashList.cpp
Normal file
282
src/cpp/Crypto/DRHashList.cpp
Normal file
@ -0,0 +1,282 @@
|
|||||||
|
//------------------------------------------------------------------
|
||||||
|
// hash list implementation
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
|
||||||
|
#include "DRHashList.h"
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
// DRStaticHashList
|
||||||
|
// set the data
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
void DRStaticHashList::setData( u32 nItems, DRHashListItem *pItems)
|
||||||
|
{
|
||||||
|
m_nItems = nItems;
|
||||||
|
m_pItems = pItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
// DRStaticHashList
|
||||||
|
// does an item exist
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
bool DRStaticHashList::itemExists( DHASH hashValue, u32 *outIndex ) const
|
||||||
|
{
|
||||||
|
s32 window[3];
|
||||||
|
|
||||||
|
// empty???
|
||||||
|
if( m_nItems==0 )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// simple binary search
|
||||||
|
// divide and conquer is maybe faster?
|
||||||
|
window[0] = 0;
|
||||||
|
window[2] = m_nItems-1;
|
||||||
|
while( window[0]<=window[2] )
|
||||||
|
{
|
||||||
|
window[1] = (window[0]+window[2])/2;
|
||||||
|
|
||||||
|
// is this the item we're looking for?
|
||||||
|
if( m_pItems[window[1]].hashValue==hashValue )
|
||||||
|
{
|
||||||
|
if( outIndex )
|
||||||
|
outIndex[0] = window[1];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check whether to search top or bottom half of list
|
||||||
|
if( m_pItems[window[1]].hashValue<hashValue )
|
||||||
|
window[0] = window[1]+1;
|
||||||
|
else
|
||||||
|
window[2] = window[1]-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
// DRStaticHashList
|
||||||
|
// find an entry by hash
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
void *DRStaticHashList::findByHash( DHASH hashValue ) const
|
||||||
|
{
|
||||||
|
s32 window[3];
|
||||||
|
|
||||||
|
// empty???
|
||||||
|
if( m_nItems==0 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// simple binary search
|
||||||
|
// divide and conquer is maybe faster?
|
||||||
|
window[0] = 0;
|
||||||
|
window[2] = m_nItems-1;
|
||||||
|
while( window[0]<=window[2] )
|
||||||
|
{
|
||||||
|
window[1] = (window[0]+window[2])/2;
|
||||||
|
|
||||||
|
// is this the item we're looking for?
|
||||||
|
if( m_pItems[window[1]].hashValue==hashValue )
|
||||||
|
return m_pItems[window[1]].data;
|
||||||
|
|
||||||
|
// check whether to search top or bottom half of list
|
||||||
|
if( m_pItems[window[1]].hashValue<hashValue )
|
||||||
|
window[0] = window[1]+1;
|
||||||
|
else
|
||||||
|
window[2] = window[1]-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
// DRStaticHashList
|
||||||
|
// find an entry by index
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
void *DRStaticHashList::findByIndex( u32 index ) const
|
||||||
|
{
|
||||||
|
if( index>=m_nItems )
|
||||||
|
return 0;
|
||||||
|
return m_pItems[index].data;
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
// DRStaticHashList
|
||||||
|
// find a hash by index
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
DHASH DRStaticHashList::findHashByIndex( u32 index ) const
|
||||||
|
{
|
||||||
|
if( index>=m_nItems )
|
||||||
|
return 0;
|
||||||
|
return m_pItems[index].hashValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DRStaticHashList::setDataByIndex(u32 index, void* data)
|
||||||
|
{
|
||||||
|
if (index >= m_nItems)
|
||||||
|
return;
|
||||||
|
m_pItems[index].data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
// DRStaticHashList
|
||||||
|
// find the index where a given hash value should go
|
||||||
|
// this is very similar to the FindByHash routine
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
u32 DRStaticHashList::findIndexForHash( DHASH hashValue )
|
||||||
|
{
|
||||||
|
s32 window[3];
|
||||||
|
|
||||||
|
if( m_nItems==0 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// simple binary search
|
||||||
|
// divide and conquer is maybe faster?
|
||||||
|
window[0] = 0;
|
||||||
|
window[2] = m_nItems-1;
|
||||||
|
while( window[0]<=window[2] )
|
||||||
|
{
|
||||||
|
window[1] = (window[0]+window[2])/2;
|
||||||
|
|
||||||
|
// is this the item we're looking for?
|
||||||
|
if( m_pItems[window[1]].hashValue==hashValue )
|
||||||
|
return window[1];
|
||||||
|
|
||||||
|
// check whether to search top or bottom half of list
|
||||||
|
if( m_pItems[window[1]].hashValue<hashValue )
|
||||||
|
window[0] = window[1]+1;
|
||||||
|
else
|
||||||
|
window[2] = window[1]-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// do we belong after this item?
|
||||||
|
if( m_pItems[window[1]].hashValue<hashValue )
|
||||||
|
window[1]++;
|
||||||
|
return window[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
// DRHashList
|
||||||
|
// sort items (static member function)
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
#ifdef _WIN32
|
||||||
|
int __cdecl hashSortFn( const void *a, const void *b )
|
||||||
|
#else
|
||||||
|
int hashSortFn( const void *a, const void *b )
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
if( (((DRHashListItem*)a)->hashValue) > (((DRHashListItem*)b)->hashValue) )
|
||||||
|
return 1;
|
||||||
|
if( (((DRHashListItem*)a)->hashValue) < (((DRHashListItem*)b)->hashValue) )
|
||||||
|
return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DRHashList::sortItems( u32 numItems, DRHashListItem *pItems )
|
||||||
|
{
|
||||||
|
qsort(pItems,numItems,getSizeOfItem(),hashSortFn);
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
// DRHashList
|
||||||
|
// destructor
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
DRHashList::~DRHashList()
|
||||||
|
{
|
||||||
|
clear(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
// DRHashList
|
||||||
|
// clear the hash list out
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
void DRHashList::clear( bool freeMemory )
|
||||||
|
{
|
||||||
|
m_nItems = 0;
|
||||||
|
if( freeMemory && m_pItems )
|
||||||
|
{
|
||||||
|
m_maxItems = 0;
|
||||||
|
free(m_pItems);
|
||||||
|
m_pItems = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
// DRHashList
|
||||||
|
// add an item to the DRHashList
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
bool DRHashList::addByHash( DHASH hashValue, void *pData )
|
||||||
|
{
|
||||||
|
u32 toIndex;
|
||||||
|
DRHashListItem *pMe;
|
||||||
|
|
||||||
|
// find where this hashValue goes
|
||||||
|
toIndex = findIndexForHash(hashValue);
|
||||||
|
|
||||||
|
// is an item with this hash already here?
|
||||||
|
if( toIndex!=m_nItems && m_pItems[toIndex].hashValue==hashValue )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// create room in the hash table
|
||||||
|
if( m_nItems==m_maxItems )
|
||||||
|
{ // need to reallocate some data
|
||||||
|
m_maxItems += 32; // allocate some more items
|
||||||
|
m_pItems = (DRHashListItem*)realloc(m_pItems,m_maxItems*getSizeOfItem());
|
||||||
|
}
|
||||||
|
|
||||||
|
pMe = &m_pItems[toIndex];
|
||||||
|
|
||||||
|
// make a hole for me to go
|
||||||
|
if( toIndex!=m_nItems )
|
||||||
|
{
|
||||||
|
memmove( &pMe[1],pMe,(m_nItems-toIndex)*getSizeOfItem());
|
||||||
|
}
|
||||||
|
|
||||||
|
pMe->hashValue = hashValue;
|
||||||
|
pMe->data = pData;
|
||||||
|
|
||||||
|
m_nItems++;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void DRHashList::resize(u32 newSize)
|
||||||
|
{
|
||||||
|
if (newSize > m_maxItems) {
|
||||||
|
m_maxItems = newSize;
|
||||||
|
if (m_pItems) {
|
||||||
|
m_pItems = (DRHashListItem*)realloc(m_pItems, m_maxItems*getSizeOfItem());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
m_pItems = (DRHashListItem *)malloc(m_maxItems*getSizeOfItem());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
// DRHashList
|
||||||
|
// remove an item to the DRHashList
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
bool DRHashList::removeByHash( DHASH hashValue )
|
||||||
|
{
|
||||||
|
u32 toIndex;
|
||||||
|
|
||||||
|
// find where this hashValue goes
|
||||||
|
toIndex = findIndexForHash(hashValue);
|
||||||
|
|
||||||
|
// is an item with this hash here?
|
||||||
|
if( toIndex==m_nItems || m_pItems[toIndex].hashValue!=hashValue )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// remove this item from the list
|
||||||
|
m_nItems-=1;
|
||||||
|
if( toIndex!=m_nItems )
|
||||||
|
{
|
||||||
|
memmove(&m_pItems[toIndex],&m_pItems[toIndex+1],(m_nItems-toIndex)*getSizeOfItem());
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
116
src/cpp/Crypto/DRHashList.h
Normal file
116
src/cpp/Crypto/DRHashList.h
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
/*/*************************************************************************
|
||||||
|
* *
|
||||||
|
* Core, Core-Lib for my programs, Core doesn't need any libraries *
|
||||||
|
* Copyright (C) 2012, 2013, 2014 Dario Rekowski *
|
||||||
|
* Email: ***REMOVED*** Web: ***REMOVED*** *
|
||||||
|
* *
|
||||||
|
* This program is free software: you can redistribute it and/or modify *
|
||||||
|
* it under the terms of the GNU General Public License as published by *
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or *
|
||||||
|
* any later version. *
|
||||||
|
* *
|
||||||
|
* This program 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 General Public License for more details. *
|
||||||
|
* *
|
||||||
|
* You should have received a copy of the GNU General Public License *
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
|
||||||
|
* *
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
//---------------------------------------------------------
|
||||||
|
// hash list definition
|
||||||
|
// aus dem Buch "Goldene Regeln der Spieleprogrammierung" von Martin Brownlow
|
||||||
|
//---------------------------------------------------------
|
||||||
|
#ifndef __DR_CORE2_HASH_LIST__
|
||||||
|
#define __DR_CORE2_HASH_LIST__
|
||||||
|
|
||||||
|
#include "DRHash.h"
|
||||||
|
|
||||||
|
//---------------------------------------------------------
|
||||||
|
// an item in the hash list
|
||||||
|
//---------------------------------------------------------
|
||||||
|
class DRHashListItem
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DHASH hashValue;
|
||||||
|
void *data;
|
||||||
|
};
|
||||||
|
|
||||||
|
//---------------------------------------------------------
|
||||||
|
// static hash list implementation
|
||||||
|
//---------------------------------------------------------
|
||||||
|
class DRStaticHashList
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DRStaticHashList() : m_nItems(0),m_pItems(0) { /*empty*/ }
|
||||||
|
~DRStaticHashList() { /*empty*/ }
|
||||||
|
|
||||||
|
void setData( u32 nItems, DRHashListItem *pItems);
|
||||||
|
const void *getData() const { return m_pItems; }
|
||||||
|
u32 getDataSize( ) const { return m_nItems*sizeof(DRHashListItem); }
|
||||||
|
u32 getNItems( ) const { return m_nItems; }
|
||||||
|
|
||||||
|
void *findByHash( DHASH hashValue ) const;
|
||||||
|
void *findByIndex( u32 index ) const;
|
||||||
|
DHASH findHashByIndex( u32 index ) const;
|
||||||
|
void setDataByIndex(u32 index, void* data);
|
||||||
|
bool itemExists( DHASH hashValue, u32 *outIndex=0 ) const;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// find the index where a hash value should go
|
||||||
|
u32 findIndexForHash( DHASH hashValue );
|
||||||
|
inline static size_t getSizeOfItem() {return sizeof(DRHashListItem);}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
u32 m_nItems;
|
||||||
|
DRHashListItem *m_pItems;
|
||||||
|
};
|
||||||
|
|
||||||
|
//---------------------------------------------------------
|
||||||
|
// general case hash list implementation
|
||||||
|
//---------------------------------------------------------
|
||||||
|
class DRHashList : public DRStaticHashList
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static void sortItems( u32 numItems, DRHashListItem *pItems );
|
||||||
|
|
||||||
|
public:
|
||||||
|
DRHashList() : DRStaticHashList(), m_maxItems(0) { /*empty*/ }
|
||||||
|
~DRHashList();
|
||||||
|
|
||||||
|
// inherited functionality
|
||||||
|
//void *FindByHash( DHASH hashValue ) const;
|
||||||
|
|
||||||
|
// clear the list
|
||||||
|
void clear( bool freeMemory=false );
|
||||||
|
|
||||||
|
// functions by hash
|
||||||
|
bool addByHash( DHASH hashValue, void *pData );
|
||||||
|
bool removeByHash( DHASH hashValue );
|
||||||
|
|
||||||
|
void resize(u32 newSize);
|
||||||
|
|
||||||
|
// functions by type
|
||||||
|
template <class X>
|
||||||
|
inline bool add( X *pData )
|
||||||
|
{
|
||||||
|
return addByHash(pData->makeHash(),pData);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class X>
|
||||||
|
inline bool remove( const X *pData )
|
||||||
|
{
|
||||||
|
return removeByHash(pData->makeHash());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
u32 m_maxItems;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif //__DR_CORE2_HASH_LIST__
|
||||||
98
src/cpp/Crypto/mnemonic.cpp
Normal file
98
src/cpp/Crypto/mnemonic.cpp
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
|
||||||
|
|
||||||
|
#include "mnemonic.h"
|
||||||
|
#include <memory>
|
||||||
|
#include <cstring>
|
||||||
|
#include "../dependencies/tinf/src/tinf.h"
|
||||||
|
|
||||||
|
Mnemonic::Mnemonic()
|
||||||
|
{
|
||||||
|
memset(mWords, 0, 2048);
|
||||||
|
mWordHashIndices.resize(2048);
|
||||||
|
}
|
||||||
|
|
||||||
|
Mnemonic::~Mnemonic()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 2048; i++) {
|
||||||
|
if (mWords[i]) {
|
||||||
|
free(mWords[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
memset(mWords, 0, 2048);
|
||||||
|
mWordHashIndices.clear(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int Mnemonic::init(void(*fill_words_func)(unsigned char*), unsigned int original_size, unsigned int compressed_size)
|
||||||
|
{
|
||||||
|
unsigned char* buffer = (unsigned char*)malloc(compressed_size);
|
||||||
|
unsigned char* uncompressed_buffer = (unsigned char*)malloc(original_size + 1);
|
||||||
|
memset(uncompressed_buffer, 0, original_size + 1);
|
||||||
|
fill_words_func(buffer);
|
||||||
|
|
||||||
|
// uncompress
|
||||||
|
unsigned int original_size_cpy = original_size;
|
||||||
|
|
||||||
|
if (tinf_gzip_uncompress(uncompressed_buffer, &original_size_cpy, buffer, compressed_size) != TINF_OK) {
|
||||||
|
free(buffer);
|
||||||
|
free(uncompressed_buffer);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (original_size_cpy != original_size) {
|
||||||
|
free(buffer);
|
||||||
|
free(uncompressed_buffer);
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
free(buffer);
|
||||||
|
|
||||||
|
//printf("c[Mnemonic::%s] uncompressing success\n", __FUNCTION__);
|
||||||
|
// fill words in array and hashList
|
||||||
|
int cursor = 0;
|
||||||
|
u32 word_begin = 0, word_end = 0;
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < original_size; i++) {
|
||||||
|
if (cursor >= 2048) {
|
||||||
|
return -3;
|
||||||
|
}
|
||||||
|
if (uncompressed_buffer[i] == ',') {
|
||||||
|
word_end = i;
|
||||||
|
|
||||||
|
u32 word_size = word_end - word_begin;
|
||||||
|
if (word_end < word_begin) {
|
||||||
|
//printf("%c %c %c\n", uncompressed_buffer[i - 1], uncompressed_buffer[i], uncompressed_buffer[i + 1]);
|
||||||
|
//printf("%s\n", uncompressed_buffer);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// + 1 for null terminating
|
||||||
|
mWords[cursor] = (char*)malloc(word_size + 1);
|
||||||
|
|
||||||
|
// fill hash list for fast reverse lookup
|
||||||
|
memset(mWords[cursor], 0, word_size + 1);
|
||||||
|
if (word_begin + word_size >= original_size) {
|
||||||
|
printf("c[Mnemonic::%s] word goes out of array bounds\n", __FUNCTION__);
|
||||||
|
free(uncompressed_buffer);
|
||||||
|
return -4;
|
||||||
|
}
|
||||||
|
memcpy(mWords[cursor], &uncompressed_buffer[word_begin], word_size);
|
||||||
|
|
||||||
|
//char bu[256]; memset(bu, 0, 256);
|
||||||
|
//memcpy(bu, &uncompressed_buffer[word_begin - 1], 10);
|
||||||
|
//printf("word (%d): %s\n", cursor, bu);
|
||||||
|
|
||||||
|
DHASH word_hash = DRMakeStringHash(mWords[cursor]);
|
||||||
|
mWordHashIndices.addByHash(word_hash, (void*)cursor);
|
||||||
|
|
||||||
|
word_begin = i + 1;
|
||||||
|
cursor++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//printf("c[Mnemonic::%s] before freeing uncompressed buffer \n", __FUNCTION__);
|
||||||
|
free(uncompressed_buffer);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
//printf("c[Mnemonic::%s] before freeing buffer \n", __FUNCTION__);
|
||||||
|
free(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
34
src/cpp/Crypto/mnemonic.h
Normal file
34
src/cpp/Crypto/mnemonic.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#ifndef DR_MNEMONIC_H
|
||||||
|
#define DR_MNEMONIC_H
|
||||||
|
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
* @author: einhornimmond
|
||||||
|
*
|
||||||
|
* @date: 16.06.19
|
||||||
|
*
|
||||||
|
* @desc: Class for handling mnemonic word list, unpacking, reverse lookup
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "DRHashList.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Mnemonic
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Mnemonic();
|
||||||
|
~Mnemonic();
|
||||||
|
|
||||||
|
int init(void(*fill_words_func)(unsigned char*), unsigned int original_size, unsigned int compressed_size);
|
||||||
|
|
||||||
|
inline const char* getWord(unsigned int index) { if (index < 2048) return mWords[index]; return nullptr; }
|
||||||
|
inline unsigned long getWordIndex(const char* word) { DHASH word_hash = DRMakeStringHash(word); return (long)mWordHashIndices.findByHash(word_hash); }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
char* mWords[2048];
|
||||||
|
DRHashList mWordHashIndices;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //DR_MNEMONIC_H
|
||||||
11
src/cpp/Crypto/mnemonic_bip0039.h
Normal file
11
src/cpp/Crypto/mnemonic_bip0039.h
Normal file
File diff suppressed because one or more lines are too long
11
src/cpp/Crypto/mnemonic_german.h
Normal file
11
src/cpp/Crypto/mnemonic_german.h
Normal file
File diff suppressed because one or more lines are too long
81
src/cpp/Gradido_LoginServer.cpp
Normal file
81
src/cpp/Gradido_LoginServer.cpp
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
#include "Gradido_LoginServer.h"
|
||||||
|
#include "HTTPInterface/PageRequestHandlerFactory.h"
|
||||||
|
|
||||||
|
#include "Poco/Util/HelpFormatter.h"
|
||||||
|
#include "Poco/Net/ServerSocket.h"
|
||||||
|
#include "Poco/Net/HTTPServer.h"
|
||||||
|
|
||||||
|
#include <sodium.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Gradido_LoginServer::Gradido_LoginServer()
|
||||||
|
: _helpRequested(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Gradido_LoginServer::~Gradido_LoginServer()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Gradido_LoginServer::initialize(Application& self)
|
||||||
|
{
|
||||||
|
loadConfiguration(); // load default configuration files, if present
|
||||||
|
ServerApplication::initialize(self);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gradido_LoginServer::uninitialize()
|
||||||
|
{
|
||||||
|
ServerApplication::uninitialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gradido_LoginServer::defineOptions(Poco::Util::OptionSet& options)
|
||||||
|
{
|
||||||
|
ServerApplication::defineOptions(options);
|
||||||
|
|
||||||
|
options.addOption(
|
||||||
|
Poco::Util::Option("help", "h", "display help information on command line arguments")
|
||||||
|
.required(false)
|
||||||
|
.repeatable(false));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gradido_LoginServer::handleOption(const std::string& name, const std::string& value)
|
||||||
|
{
|
||||||
|
ServerApplication::handleOption(name, value);
|
||||||
|
if (name == "help") _helpRequested = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gradido_LoginServer::displayHelp()
|
||||||
|
{
|
||||||
|
Poco::Util::HelpFormatter helpFormatter(options());
|
||||||
|
helpFormatter.setCommand(commandName());
|
||||||
|
helpFormatter.setUsage("OPTIONS");
|
||||||
|
helpFormatter.setHeader("A web server that shows how to work with HTML forms.");
|
||||||
|
helpFormatter.format(std::cout);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Gradido_LoginServer::main(const std::vector<std::string>& args)
|
||||||
|
{
|
||||||
|
if (_helpRequested)
|
||||||
|
{
|
||||||
|
displayHelp();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
unsigned short port = (unsigned short)config().getInt("HTTPServer.port", 9980);
|
||||||
|
|
||||||
|
// set-up a server socket
|
||||||
|
Poco::Net::ServerSocket svs(port);
|
||||||
|
// set-up a HTTPServer instance
|
||||||
|
Poco::Net::HTTPServer srv(new PageRequestHandlerFactory, svs, new Poco::Net::HTTPServerParams);
|
||||||
|
// start the HTTPServer
|
||||||
|
srv.start();
|
||||||
|
// wait for CTRL-C or kill
|
||||||
|
waitForTerminationRequest();
|
||||||
|
// Stop the HTTPServer
|
||||||
|
srv.stop();
|
||||||
|
}
|
||||||
|
return Application::EXIT_OK;
|
||||||
|
}
|
||||||
|
|
||||||
39
src/cpp/Gradido_LoginServer.h
Normal file
39
src/cpp/Gradido_LoginServer.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
#ifndef Gradido_LoginServer_INCLUDED
|
||||||
|
#define Gradido_LoginServer_INCLUDED
|
||||||
|
|
||||||
|
#include "Poco/Util/ServerApplication.h"
|
||||||
|
|
||||||
|
class Gradido_LoginServer : public Poco::Util::ServerApplication
|
||||||
|
{
|
||||||
|
|
||||||
|
/// The main application class.
|
||||||
|
///
|
||||||
|
/// This class handles command-line arguments and
|
||||||
|
/// configuration files.
|
||||||
|
/// Start the Gradido_LoginServer executable with the help
|
||||||
|
/// option (/help on Windows, --help on Unix) for
|
||||||
|
/// the available command line options.
|
||||||
|
///
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
Gradido_LoginServer();
|
||||||
|
~Gradido_LoginServer();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void initialize(Application& self);
|
||||||
|
|
||||||
|
void uninitialize();
|
||||||
|
|
||||||
|
void defineOptions(Poco::Util::OptionSet& options);
|
||||||
|
|
||||||
|
void handleOption(const std::string& name, const std::string& value);
|
||||||
|
void displayHelp();
|
||||||
|
|
||||||
|
int main(const std::vector<std::string>& args);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool _helpRequested;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //Gradido_LoginServer_INCLUDED
|
||||||
105
src/cpp/HTTPInterface/ConfigPage.cpp
Normal file
105
src/cpp/HTTPInterface/ConfigPage.cpp
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
#include "ConfigPage.h"
|
||||||
|
#include "Poco/Net/HTTPServerRequest.h"
|
||||||
|
#include "Poco/Net/HTTPServerResponse.h"
|
||||||
|
#include "Poco/Net/HTMLForm.h"
|
||||||
|
#include "Poco/DeflatingStream.h"
|
||||||
|
|
||||||
|
|
||||||
|
#line 4 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\config.cpsp"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void ConfigPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response)
|
||||||
|
{
|
||||||
|
response.setChunkedTransferEncoding(true);
|
||||||
|
response.setContentType("text/html");
|
||||||
|
bool _compressResponse(request.hasToken("Accept-Encoding", "gzip"));
|
||||||
|
if (_compressResponse) response.set("Content-Encoding", "gzip");
|
||||||
|
|
||||||
|
Poco::Net::HTMLForm form(request, request.stream());
|
||||||
|
std::ostream& _responseStream = response.send();
|
||||||
|
Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1);
|
||||||
|
std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream;
|
||||||
|
responseStream << "\n";
|
||||||
|
responseStream << "<!DOCTYPE html>\n";
|
||||||
|
responseStream << "<html>\n";
|
||||||
|
responseStream << "<head>\n";
|
||||||
|
responseStream << "<meta charset=\"UTF-8\">\n";
|
||||||
|
responseStream << "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n";
|
||||||
|
responseStream << "<title>Gradido Login Server: Config</title>\n";
|
||||||
|
responseStream << "<!--<link rel=\"stylesheet\" type=\"text/css\" href=\"css/styles.min.css\">-->\n";
|
||||||
|
responseStream << "<link rel=\"stylesheet\" type=\"text/css\" href=\"https://gradido2.dario-rekowski.de/css/styles.css\">\n";
|
||||||
|
responseStream << "</head>\n";
|
||||||
|
responseStream << "<body>\n";
|
||||||
|
responseStream << "<h1>Config</h1>\n";
|
||||||
|
responseStream << "<form method=\"POST\">\n";
|
||||||
|
responseStream << "\t<div class=\"grd_container\">\n";
|
||||||
|
responseStream << "\n";
|
||||||
|
responseStream << "\t\t<fieldset class=\"grd_container_small\">\n";
|
||||||
|
responseStream << "\t\t\t<legend>Server Admin Key</legend>\n";
|
||||||
|
responseStream << "\t\t\t<p>Möchtest du einen neuen Server Key generieren oder einen existierenden verwenden?</p>\n";
|
||||||
|
responseStream << "\t\t\t<p>Wenn du bereits einen besitzt kopiere bitte den Merksatz dafür in die Textarea.</p>\n";
|
||||||
|
responseStream << "\t\t\t<p class=\"grd_small\">\n";
|
||||||
|
responseStream << "\t\t\t\t<input id=\"server-admin-key-new-yes\" type=\"radio\" name=\"new-server-admin-key\" value=\"yes\" checked/>\n";
|
||||||
|
responseStream << "\t\t\t\t<label for=\"server-admin-key-new-yes\">Einen neuen generieren!</label>\n";
|
||||||
|
responseStream << "\t\t\t</p>\n";
|
||||||
|
responseStream << "\t\t\t<p class=\"grd_small\">\n";
|
||||||
|
responseStream << "\t\t\t\t<input id=\"server-admin-key-new-no\" type=\"radio\" name=\"new-server-admin-key\" value=\"no\"/>\n";
|
||||||
|
responseStream << "\t\t\t\t<label for=\"server-admin-key-new-no\">Einen existierenden verwenden!</label>\n";
|
||||||
|
responseStream << "\t\t\t</p>\n";
|
||||||
|
responseStream << "\t\t\t<textarea style=\"width:100%;height:100px\" name=\"server-admin-key-existing\"></textarea>\n";
|
||||||
|
responseStream << "\t\t</fieldset>\n";
|
||||||
|
responseStream << "\t\t<fieldset class=\"grd_container_small\">\n";
|
||||||
|
responseStream << "\t\t\t<legend>Login-Server (dieser Server)</legend>\n";
|
||||||
|
responseStream << "\t\t\t<p>Bitte gebe die Daten für diesen Server an. </p>\n";
|
||||||
|
responseStream << "\t\t\t<fieldset>\n";
|
||||||
|
responseStream << "\t\t\t\t<legend>Datenbank</legend>\n";
|
||||||
|
responseStream << "\t\t\t\t<div class=\"grd-input\">\n";
|
||||||
|
responseStream << "\t\t\t\t\t<label for=\"server-db-user\">Benutzernamen: </label>\n";
|
||||||
|
responseStream << "\t\t\t\t\t<input id=\"server-db-user\" type=\"text\" name=\"server-db-user\" value=\"root\">\n";
|
||||||
|
responseStream << "\t\t\t\t</div>\n";
|
||||||
|
responseStream << "\t\t\t\t<div class=\"grd-input\">\n";
|
||||||
|
responseStream << "\t\t\t\t\t<label for=\"server-db-pwd\">Passwort: </label>\n";
|
||||||
|
responseStream << "\t\t\t\t\t<input id=\"server-db-pwd\" type=\"password\" name=\"server-db-pwd\" value=\"\">\n";
|
||||||
|
responseStream << "\t\t\t\t</div>\n";
|
||||||
|
responseStream << "\t\t\t\t<div class=\"grd-input\">\n";
|
||||||
|
responseStream << "\t\t\t\t\t<label for=\"server-db-name\">Datenbank Name: </label>\n";
|
||||||
|
responseStream << "\t\t\t\t\t<input id=\"server-db-name\" name=\"server-db-name\" value=\"\">\n";
|
||||||
|
responseStream << "\t\t\t\t</div>\n";
|
||||||
|
responseStream << "\t\t\t</fieldset>\n";
|
||||||
|
responseStream << "\t\t\t<div class=\"grd-input\">\n";
|
||||||
|
responseStream << "\t\t\t\t<label for=\"server-domain\">Server Name (Domain)</label>\n";
|
||||||
|
responseStream << "\t\t\t\t<input id=\"server-domain\" name=\"server-domain\" type=\"text\">\n";
|
||||||
|
responseStream << "\t\t\t</div>\n";
|
||||||
|
responseStream << "\t\t</fieldset>\n";
|
||||||
|
responseStream << "\t\t<fieldset class=\"grd_container_small\">\n";
|
||||||
|
responseStream << "\t\t\t<legend>PHP-Server</legend>\n";
|
||||||
|
responseStream << "\t\t\t<p>Bitte gebe hier die Daten des php-Servers an.</p>\n";
|
||||||
|
responseStream << "\t\t\t<fieldset>\n";
|
||||||
|
responseStream << "\t\t\t\t<legend>Datenbank</legend>\n";
|
||||||
|
responseStream << "\t\t\t\t<div class=\"grd-input\">\n";
|
||||||
|
responseStream << "\t\t\t\t\t<label for=\"php-server-db-user\">Benutzernamen: </label>\n";
|
||||||
|
responseStream << "\t\t\t\t\t<input id=\"php-server-db-user\" type=\"text\" name=\"php-server-db-user\" value=\"root\">\n";
|
||||||
|
responseStream << "\t\t\t\t</div>\n";
|
||||||
|
responseStream << "\t\t\t\t<div class=\"grd-input\">\n";
|
||||||
|
responseStream << "\t\t\t\t\t<label for=\"php-server-db-pwd\">Passwort: </label>\n";
|
||||||
|
responseStream << "\t\t\t\t\t<input id=\"php-server-db-pwd\" type=\"password\" name=\"php-server-db-pwd\" value=\"\">\n";
|
||||||
|
responseStream << "\t\t\t\t</div>\n";
|
||||||
|
responseStream << "\t\t\t\t<div class=\"grd-input\">\n";
|
||||||
|
responseStream << "\t\t\t\t\t<label for=\"php-server-db-name\">Datenbank Name: </label>\n";
|
||||||
|
responseStream << "\t\t\t\t\t<input id=\"php-server-db-name\" name=\"php-server-db-name\" value=\"\">\n";
|
||||||
|
responseStream << "\t\t\t\t</div>\n";
|
||||||
|
responseStream << "\t\t\t</fieldset>\n";
|
||||||
|
responseStream << "\t\t\t<div class=\"grd-input\">\n";
|
||||||
|
responseStream << "\t\t\t\t<label for=\"php-server-url\">PHP-Server Url (mit Port)</label>\n";
|
||||||
|
responseStream << "\t\t\t\t<input id=\"php-server-url\" name=\"php-server-url\" type=\"text\">\n";
|
||||||
|
responseStream << "\t\t\t</div>\n";
|
||||||
|
responseStream << "\t\t</fieldset>\n";
|
||||||
|
responseStream << "\t\t<input class=\"grd_bn_succeed\" type=\"submit\" name=\"submit\" value=\"Absenden\">\n";
|
||||||
|
responseStream << "\t</div>\n";
|
||||||
|
responseStream << "</form>\n";
|
||||||
|
responseStream << "</body>\n";
|
||||||
|
responseStream << "</html>\n";
|
||||||
|
if (_compressResponse) _gzipStream.close();
|
||||||
|
}
|
||||||
15
src/cpp/HTTPInterface/ConfigPage.h
Normal file
15
src/cpp/HTTPInterface/ConfigPage.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#ifndef ConfigPage_INCLUDED
|
||||||
|
#define ConfigPage_INCLUDED
|
||||||
|
|
||||||
|
|
||||||
|
#include "Poco/Net/HTTPRequestHandler.h"
|
||||||
|
|
||||||
|
|
||||||
|
class ConfigPage: public Poco::Net::HTTPRequestHandler
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif // ConfigPage_INCLUDED
|
||||||
41
src/cpp/HTTPInterface/HandleFileRequest.cpp
Normal file
41
src/cpp/HTTPInterface/HandleFileRequest.cpp
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
#include "HandleFileRequest.h"
|
||||||
|
#include "Poco/Net/HTTPServerRequest.h"
|
||||||
|
#include "Poco/Net/HTTPServerResponse.h"
|
||||||
|
#include "Poco/DeflatingStream.h"
|
||||||
|
#include "Poco/FileStream.h"
|
||||||
|
|
||||||
|
void HandleFileRequest::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response)
|
||||||
|
{
|
||||||
|
response.setChunkedTransferEncoding(true);
|
||||||
|
|
||||||
|
std::string uri = request.getURI();
|
||||||
|
// check endung
|
||||||
|
size_t last_point = uri.find_last_of('.');
|
||||||
|
std::string endung = uri.substr(last_point+1);
|
||||||
|
|
||||||
|
std::string mediaType;
|
||||||
|
|
||||||
|
//printf("endung: %s\n", endung.data());
|
||||||
|
if (endung == "css") {
|
||||||
|
mediaType = "text/css";
|
||||||
|
}
|
||||||
|
else if (endung == "js") {
|
||||||
|
mediaType = "text/javascript";
|
||||||
|
}
|
||||||
|
else if (endung == "ico") {
|
||||||
|
mediaType = "image/x-icon";
|
||||||
|
}
|
||||||
|
std::string path = "data" + uri;
|
||||||
|
printf("file path: %s\n", path.data());
|
||||||
|
response.sendFile(path, mediaType);
|
||||||
|
/*
|
||||||
|
bool _compressResponse(request.hasToken("Accept-Encoding", "gzip"));
|
||||||
|
if (_compressResponse) response.set("Content-Encoding", "gzip");
|
||||||
|
|
||||||
|
std::ostream& _responseStream = response.send();
|
||||||
|
Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1);
|
||||||
|
std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream;
|
||||||
|
responseStream << new Poco::FileInputStream("./data/" + uri);
|
||||||
|
if (_compressResponse) _gzipStream.close();
|
||||||
|
*/
|
||||||
|
}
|
||||||
15
src/cpp/HTTPInterface/HandleFileRequest.h
Normal file
15
src/cpp/HTTPInterface/HandleFileRequest.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#ifndef HandleFileRequest_INCLUDED
|
||||||
|
#define HandleFileRequest_INCLUDED
|
||||||
|
|
||||||
|
|
||||||
|
#include "Poco/Net/HTTPRequestHandler.h"
|
||||||
|
|
||||||
|
|
||||||
|
class HandleFileRequest : public Poco::Net::HTTPRequestHandler
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif // HandleFileRequest_INCLUDED
|
||||||
31
src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp
Normal file
31
src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#include "PageRequestHandlerFactory.h"
|
||||||
|
#include "Poco/Net/HTTPServerRequest.h"
|
||||||
|
|
||||||
|
#include "ConfigPage.h"
|
||||||
|
#include "LoginPage.h"
|
||||||
|
#include "RegisterPage.h"
|
||||||
|
#include "HandleFileRequest.h"
|
||||||
|
|
||||||
|
PageRequestHandlerFactory::PageRequestHandlerFactory()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Poco::Net::HTTPRequestHandler* PageRequestHandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest& request)
|
||||||
|
{
|
||||||
|
printf("request uri: %s\n", request.getURI().data());
|
||||||
|
|
||||||
|
std::string uri = request.getURI();
|
||||||
|
|
||||||
|
if (uri == "/") {
|
||||||
|
return new ConfigPage;
|
||||||
|
}
|
||||||
|
else if (uri == "/login") {
|
||||||
|
return new LoginPage;
|
||||||
|
}
|
||||||
|
else if (uri == "/register") {
|
||||||
|
return new RegisterPage;
|
||||||
|
}
|
||||||
|
return new HandleFileRequest;
|
||||||
|
//return new PageRequestHandlerFactory;
|
||||||
|
}
|
||||||
19
src/cpp/HTTPInterface/PageRequestHandlerFactory.h
Normal file
19
src/cpp/HTTPInterface/PageRequestHandlerFactory.h
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#ifndef __DR_PAGE_REQUEST_HANDLER_FACTORY_H
|
||||||
|
#define __DR_PAGE_REQUEST_HANDLER_FACTORY_H
|
||||||
|
|
||||||
|
#include "Poco/Net/HTTPRequestHandlerFactory.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define HTTP_PAGES_COUNT 1
|
||||||
|
|
||||||
|
class PageRequestHandlerFactory : public Poco::Net::HTTPRequestHandlerFactory
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PageRequestHandlerFactory();
|
||||||
|
|
||||||
|
Poco::Net::HTTPRequestHandler* createRequestHandler(const Poco::Net::HTTPServerRequest& request);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // __DR_PAGE_REQUEST_HANDLER_FACTORY_H
|
||||||
@ -0,0 +1 @@
|
|||||||
|
#include "ServerConfig.h"
|
||||||
@ -1,16 +1,14 @@
|
|||||||
#include <stdio.h>
|
#include "Gradido_LoginServer.h"
|
||||||
#include <sodium.h>
|
#include <sodium.h>
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
int main(int argc, char* argv[]) {
|
{
|
||||||
printf("hallo Welt\n");
|
|
||||||
|
|
||||||
if (sodium_init() < 0) {
|
if (sodium_init() < 0) {
|
||||||
/* panic! the library couldn't be initialized, it is not safe to use */
|
/* panic! the library couldn't be initialized, it is not safe to use */
|
||||||
}
|
printf("error initing sodium, early exit\n");
|
||||||
else {
|
return -1;
|
||||||
printf("sodium initalized\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 42;
|
Gradido_LoginServer app;
|
||||||
|
return app.run(argc, argv);
|
||||||
}
|
}
|
||||||
85
src/cpsp/config.cpsp
Normal file
85
src/cpsp/config.cpsp
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
<%@ page class="ConfigPage" %>
|
||||||
|
<%@ page form="true" %>
|
||||||
|
<%@ page compressed="true" %>
|
||||||
|
<%!
|
||||||
|
|
||||||
|
%>
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Gradido Login Server: Config</title>
|
||||||
|
<!--<link rel="stylesheet" type="text/css" href="css/styles.min.css">-->
|
||||||
|
<link rel="stylesheet" type="text/css" href="https://gradido2.dario-rekowski.de/css/styles.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Config</h1>
|
||||||
|
<form method="POST">
|
||||||
|
<div class="grd_container">
|
||||||
|
|
||||||
|
<fieldset class="grd_container_small">
|
||||||
|
<legend>Server Admin Key</legend>
|
||||||
|
<p>Möchtest du einen neuen Server Key generieren oder einen existierenden verwenden?</p>
|
||||||
|
<p>Wenn du bereits einen besitzt kopiere bitte den Merksatz dafür in die Textarea.</p>
|
||||||
|
<p class="grd_small">
|
||||||
|
<input id="server-admin-key-new-yes" type="radio" name="new-server-admin-key" value="yes" checked/>
|
||||||
|
<label for="server-admin-key-new-yes">Einen neuen generieren!</label>
|
||||||
|
</p>
|
||||||
|
<p class="grd_small">
|
||||||
|
<input id="server-admin-key-new-no" type="radio" name="new-server-admin-key" value="no"/>
|
||||||
|
<label for="server-admin-key-new-no">Einen existierenden verwenden!</label>
|
||||||
|
</p>
|
||||||
|
<textarea style="width:100%;height:100px" name="server-admin-key-existing"></textarea>
|
||||||
|
</fieldset>
|
||||||
|
<fieldset class="grd_container_small">
|
||||||
|
<legend>Login-Server (dieser Server)</legend>
|
||||||
|
<p>Bitte gebe die Daten für diesen Server an. </p>
|
||||||
|
<fieldset>
|
||||||
|
<legend>Datenbank</legend>
|
||||||
|
<div class="grd-input">
|
||||||
|
<label for="server-db-user">Benutzernamen: </label>
|
||||||
|
<input id="server-db-user" type="text" name="server-db-user" value="root">
|
||||||
|
</div>
|
||||||
|
<div class="grd-input">
|
||||||
|
<label for="server-db-pwd">Passwort: </label>
|
||||||
|
<input id="server-db-pwd" type="password" name="server-db-pwd" value="">
|
||||||
|
</div>
|
||||||
|
<div class="grd-input">
|
||||||
|
<label for="server-db-name">Datenbank Name: </label>
|
||||||
|
<input id="server-db-name" name="server-db-name" value="">
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
<div class="grd-input">
|
||||||
|
<label for="server-domain">Server Name (Domain)</label>
|
||||||
|
<input id="server-domain" name="server-domain" type="text">
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
<fieldset class="grd_container_small">
|
||||||
|
<legend>PHP-Server</legend>
|
||||||
|
<p>Bitte gebe hier die Daten des php-Servers an.</p>
|
||||||
|
<fieldset>
|
||||||
|
<legend>Datenbank</legend>
|
||||||
|
<div class="grd-input">
|
||||||
|
<label for="php-server-db-user">Benutzernamen: </label>
|
||||||
|
<input id="php-server-db-user" type="text" name="php-server-db-user" value="root">
|
||||||
|
</div>
|
||||||
|
<div class="grd-input">
|
||||||
|
<label for="php-server-db-pwd">Passwort: </label>
|
||||||
|
<input id="php-server-db-pwd" type="password" name="php-server-db-pwd" value="">
|
||||||
|
</div>
|
||||||
|
<div class="grd-input">
|
||||||
|
<label for="php-server-db-name">Datenbank Name: </label>
|
||||||
|
<input id="php-server-db-name" name="php-server-db-name" value="">
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
<div class="grd-input">
|
||||||
|
<label for="php-server-url">PHP-Server Url (mit Port)</label>
|
||||||
|
<input id="php-server-url" name="php-server-url" type="text">
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
<input class="grd_bn_succeed" type="submit" name="submit" value="Absenden">
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
39
src/cpsp/login.cpsp
Normal file
39
src/cpsp/login.cpsp
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
<%@ page class="LoginPage" %>
|
||||||
|
<%@ page form="true" %>
|
||||||
|
<%@ page compressed="true" %>
|
||||||
|
<%!
|
||||||
|
|
||||||
|
%>
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Gradido Login Server: Login</title>
|
||||||
|
<!--<link rel="stylesheet" type="text/css" href="css/styles.min.css">-->
|
||||||
|
<link rel="stylesheet" type="text/css" href="https://gradido2.dario-rekowski.de/css/styles.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Login</h1>
|
||||||
|
<form method="POST">
|
||||||
|
<div class="grd_container">
|
||||||
|
<fieldset class="grd_container_small">
|
||||||
|
<legend>Login</legend>
|
||||||
|
<p>Bitte gebe deine Zugangsdaten ein um dich einzuloggen.</p>
|
||||||
|
<p class="grd_small">
|
||||||
|
<label for="login-username">Benutzernamen</label>
|
||||||
|
<input id="login-username" type="text" name="login-username"/>
|
||||||
|
</p>
|
||||||
|
<p class="grd_small">
|
||||||
|
<label for="login-password">Passwort</label>
|
||||||
|
<input id="login-password" type="password" name="login-password"/>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</fieldset>
|
||||||
|
<input class="grd_bn_succeed" type="submit" name="submit" value="Einloggen">
|
||||||
|
<p>Du hast noch keinen Account? Dann folge dem Link um dir einen anzulegen</p>
|
||||||
|
<a href="/register">Neuen Account anlegen</a>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
46
src/cpsp/register.cpsp
Normal file
46
src/cpsp/register.cpsp
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
<%@ page class="RegisterPage" %>
|
||||||
|
<%@ page form="true" %>
|
||||||
|
<%@ page compressed="true" %>
|
||||||
|
<%!
|
||||||
|
|
||||||
|
%>
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Gradido Login Server: Register</title>
|
||||||
|
<!--<link rel="stylesheet" type="text/css" href="css/styles.min.css">-->
|
||||||
|
<link rel="stylesheet" type="text/css" href="https://gradido2.dario-rekowski.de/css/styles.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Login</h1>
|
||||||
|
<form method="POST">
|
||||||
|
<div class="grd_container">
|
||||||
|
<fieldset class="grd_container_small">
|
||||||
|
<legend>Account anlegen</legend>
|
||||||
|
<p>Bitte gebe deine Daten um einen Account anzulegen</p>
|
||||||
|
<p class="grd_small">
|
||||||
|
<label for="register-username">Benutzernamen</label>
|
||||||
|
<input id="register-username" type="text" name="register-username"/>
|
||||||
|
</p>
|
||||||
|
<p class="grd_small">
|
||||||
|
<label for="register-password">Passwort</label>
|
||||||
|
<input id="register-password" type="password" name="register-password"/>
|
||||||
|
</p>
|
||||||
|
<p>Hast du bereits schonmal ein Gradido Konto besessen?</p>
|
||||||
|
<p class="grd_small">
|
||||||
|
<input id="register-key-new-yes" type="radio" name="register-key" value="yes" checked/>
|
||||||
|
<label for="register-key-new-yes">Nein, bitte ein neues erstellen!</label>
|
||||||
|
</p>
|
||||||
|
<p class="grd_small">
|
||||||
|
<input id="register-key-new-no" type="radio" name="register-key" value="no"/>
|
||||||
|
<label for="register-key-new-no">Ja, bitte wiederherstellen!</label>
|
||||||
|
</p>
|
||||||
|
<textarea style="width:100%;height:100px" name="register-key-existing"></textarea>
|
||||||
|
</fieldset>
|
||||||
|
<input class="grd_bn_succeed" type="submit" name="submit" value="Einloggen">
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Loading…
x
Reference in New Issue
Block a user