Esempio n. 1
0
std::string verifyne::Api::b64decode(const std::string str)
{
    base64::decoder d;

    std::stringstream b64(str);
    std::stringstream plain;
    d.decode(b64, plain);
    std::string ret(plain.str());
    return ret;
}
Esempio n. 2
0
filepos_t EbmlDate::RenderData(IOCallback & output, bool /* bForceRender */, bool  /* bWithDefault */)
{
  if (GetSize() != 0) {
    assert(GetSize() == 8);
    big_int64 b64(myDate);

    output.writeFully(&b64.endian(),GetSize());
  }

  return GetSize();
}
Esempio n. 3
0
Item ItemFactoryImpl::createBase64Binary(const char* aData, size_t aLength,
                                         bool aIsBase64)
{
  try {
    store::Item_t result;
    xs_base64Binary b64( aData, aLength, aIsBase64 );
    theItemFactory->createBase64Binary( result, b64 );
    return &*result;
  }
  catch ( std::exception const &e ) {
    throw ZORBA_EXCEPTION(
      zerr::ZSTR0040_TYPE_ERROR, ERROR_PARAMS( e.what() )
    );
  }
}
Esempio n. 4
0
    void visit_value(const types::b_binary& value) {

        std::size_t b64_len;

        b64_len = (value.size / 3 + 1) * 4 + 1;
        std::unique_ptr<char> b64(reinterpret_cast<char*>(operator new(b64_len)));
        b64_ntop(value.bytes, value.size, b64.get(), b64_len);

        out << "{" << std::endl;
        pad(1);
        out << "\"$type\" : " << value.sub_type << "," << std::endl;
        pad(1);
        out << "\"$binary\" : " << b64.get() << "," << std::endl;
        pad();
        out << "}";
    }
Esempio n. 5
0
void addXMLEncapsulatedX509Certificate(xercesc::DOMDocument *doc,
					xercesc::DOMNode *root,
					bdoc::X509Cert& x509,
					const char *id)
{
	xercesc::DOMElement *x509val =
		doc->createElement(
			xercesc::XMLString::transcode(
					"EncapsulatedX509Certificate"));

	std::vector<unsigned char> der = x509.encodeDER();
	xml_schema::Base64Binary b64(&der[0], der.size());

	x509val->setTextContent(
			xercesc::XMLString::transcode(b64.encode().c_str()));

	x509val->setAttribute(
			xercesc::XMLString::transcode("Id"),
			xercesc::XMLString::transcode(id));

	root->appendChild(x509val);
}
Esempio n. 6
0
    void xml_writer_impl::write_element(const variant& element)
    {
        try
        {
            if (element.is<variant::Collection>() && element.empty() && element.type() != variant::DataTable)
            {
                write_empty_element();
                return;
            }

            switch(element.type())
            {
            case variant::None:
            {
                write_empty_element();
                break;
            }
            case variant::Any:
            case variant::String:
            {
                if (element.as<std::string>().empty())
                {
                    write_empty_element();
                    break;
                }
            }
            case variant::Float:
            case variant::Double:
            case variant::Int32:
            case variant::UInt32:
            case variant::Int64:
            case variant::UInt64:
            case variant::Boolean:
            case variant::Date:
            case variant::Time:
            case variant::DateTime:
            {
                m_os << start_tag();
                write_text(element);
                m_os << end_tag();
                break;
            }
            case variant::Dictionary:
            case variant::Bag:
            {
                if ((m_mode & xml_mode::Preserve)!=0)
                {
                    if (element.has_key(xml_attributes))
                    {
                        m_stack.top().m_attributes = element[xml_attributes];

                        if (element.size()==1)
                        {
                            write_empty_element();
                            break;
                        }
                    }

                    m_os << start_tag();

                    bool prev_is_text = false;
                    variant::const_iterator it, end(element.end());
                    for (it=element.begin(); it!=end; ++it)
                    {
                        if (it.key()==xml_attributes)
                        {
                            continue;
                        }
                        else if (it.key()==xml_text)
                        {
                            write_text(it.value());
                            prev_is_text = true;
                        }
                        else if (it.key()==xml_instruction)
                        {
                            push(it.key());

                            if (!prev_is_text)
                            {
                                m_os << indent();
                            }

                            write_instruction(it.value());

                            prev_is_text = false;

                            pop();
                        }
                        else if (it.key()==xml_comment)
                        {
                            push(it.key());

                            if (!prev_is_text)
                            {
                                m_os << indent();
                            }

                            write_comment(it.value());

                            prev_is_text = false;

                            pop();
                        }
                        else
                        {
                            push(it.key());

                            if (!prev_is_text)
                            {
                                m_os << indent();
                            }

                            write_element(it.value());

                            prev_is_text = false;

                            pop();
                        }
                    }

                    if (!prev_is_text)
                    {
                        m_os << indent();
                    }

                    m_os << end_tag();
                }
                else
                {
                    m_os << start_tag();

                    variant::const_iterator it, end(element.end());
                    for (it=element.begin(); it!=end; ++it)
                    {
                        push(it.key());

                        m_os << indent();
                        write_variant(it.value());

                        pop();
                    }

                    m_os << indent() << end_tag();
                }

                break;
            }
            case variant::List:
            {
                m_os << start_tag();

                BOOST_FOREACH(const variant& item, element)
                {
                    push();
                    m_os << indent();
                    write_variant(item);
                    pop();
                }

                m_os << indent();
                m_os << end_tag();

                break;
            }
            case variant::Tuple:
            {
                m_stack.top().m_attributes.insert("size", variant(element.size()));
                m_os << start_tag();

                BOOST_FOREACH(const variant& item, element)
                {
                    push();
                    m_os << indent();
                    write_variant(item);
                    pop();
                }

                m_os << indent();
                m_os << end_tag();
                break;
            }
            case variant::TimeSeries:
            {
                m_os << start_tag();

                variant::const_iterator it, end = element.end();
                for (it=element.begin(); it!=end; ++it)
                {
                    push().insert("time", variant(it.time()));
                    m_os << indent();
                    write_variant(it.value());
                    pop();
                }

                m_os << indent();
                m_os << end_tag();
                break;
            }
            case variant::DataTable:
            {
                const data_table& dt = element.m_value.get<variant::DataTable>();

                m_stack.top().m_attributes
                    .insert("rows",    variant(dt.size()))
                    .insert("columns", variant(dt.columns().size()));
                m_os << start_tag();

                if (!dt.columns().empty())
                {
                    push("Columns");
                    m_os << indent() << start_tag();

                    for (data_table::column_container_type::const_iterator column_iter = dt.columns().begin()
                           ; column_iter != dt.columns().end()
                           ; ++column_iter)
                    {
                        push("Column")
                            .insert("name", variant(column_iter->name()))
                            .insert("type", variant(variant::enum_to_string(column_iter->type())));
                        m_os << indent();
                        write_empty_element();
                        pop();
                    }

                    m_os << indent() << end_tag();
                    pop();
                }

                for (data_table::column_container_type::const_iterator column_iter = dt.columns().begin()
                       ; column_iter != dt.columns().end()
                       ; ++column_iter)
                {
                    push("Column").insert("name", variant(column_iter->name()));
                    m_os << indent() << start_tag();

                    if (column_iter->type() & variant_base::Primitive)
                    {
                        boost::scoped_ptr<data_table_column_writer> column_writer(
                            make_data_table_column_stream_writer(*column_iter, m_os)
                        );

                        while (column_writer->has_next())
                        {
                            push("V");
                            m_os << indent() << start_tag();
                            column_writer->write();
                            m_os << end_tag();
                            pop();

                            column_writer->advance();
                        }
                    }
                    else
                    {
                        variant::const_iterator iter(column_iter->begin());
                        variant::const_iterator end(column_iter->end());
                        while (iter != end)
                        {
                            push("V");
                            m_os << indent();
                            write_variant(*(iter++));
                            pop();
                        }
                    }

                    m_os << indent() << end_tag();
                    pop();
                }

                m_os << indent();
                m_os << end_tag();

                break;
            }
            case variant::Buffer:
            {
                m_os << start_tag();
                const void *data = element.as<void*>();
                size_t size = element.size();
                if (data!=nullptr && size>0)
                {
                    unsigned int n = 0;
                    boost::scoped_ptr<char> b64(detail::b64_encode((const char*)data, (unsigned int)size, &n));
                    if (!b64.get())
                    {
                        boost::throw_exception(variant_error("Unable to base64 encode data"));
                    }
                    m_os << b64.get();
                }
                m_os << end_tag();
                break;
            }
            case variant::Object:
            {
                const object& obj(element.as<object>());

                // write class name
                m_stack.top().m_attributes
                    .insert("class", variant(obj.name()))
                    .insert("version", variant(obj.version()));

                m_os << start_tag();

                // write parameter dictionary
                variant params;
                obj.deflate(params);
                push("params");
                m_os << indent();
                write_variant(params);
                pop();

                m_os << indent();
                m_os << end_tag();

                break;
            }
            case variant::Exception:
            {
                m_os << start_tag();

                exception_data e(element.as<exception_data>());

                push("type");
                m_os << indent();
                write_element(variant(e.type()));
                pop();
                
                push("message");
                m_os << indent();
                write_element(variant(e.message()));
                pop();

                if (!e.source().empty())
                {
                    push("source");
                    m_os << indent();
                    write_element(variant(e.source()));
                    pop();
                }

                if (!e.stack().empty())
                {
                    push("stack");
                    m_os << indent();
                    write_element(variant(e.stack()));
                    pop();
                }

                m_os << indent();
                m_os << end_tag();
                break;
            }
            case variant::Array:
            {
                const typed_array& a(element.as<typed_array>());
                m_stack.top().m_attributes
                    .insert("size", variant(a.size()))
                    .insert("type", variant(variant::enum_to_string(a.type())));
                
                m_os << start_tag();

                for (size_t i=0; i<a.size(); ++i)
                {
                    push();
                    m_os << indent();
                    write_element(variant(a[i]));
                    pop();
                }

                m_os << indent();
                m_os << end_tag();
                break;
            }
            default:
                 boost::throw_exception(variant_error("Case exhaustion: " + variant::enum_to_string(element.type()))); 
            }
Esempio n. 7
0
void CommonTestsSuite::test_b64() {
	TS_ASSERT(b64("this is a test1") == "dGhpcyBpcyBhIHRlc3Qx");
	TS_ASSERT(b64("this is a test") == "dGhpcyBpcyBhIHRlc3Q=");
	TS_ASSERT(b64("this is a tes") == "dGhpcyBpcyBhIHRlcw==");
	TS_ASSERT(b64("") == "");
}
Esempio n. 8
0
int main(int argc, char * argv [])
{
  ulxr::intializeLog4J(argv[0]);

  int success = 0;

#ifdef STRESS_IT
  for (int i= 0; i < 1000; ++i)
  {
#endif
    try
    {
      ULXR_COUT << ULXR_PCHAR("Testing patterns\n");

      ULXR_COUT << ULXR_PCHAR("boolPattern\n") << std::flush;
      testPattern(boolPattern, sizeof(boolPattern));

      ULXR_COUT << ULXR_PCHAR("int1Pattern\n");
      testPattern(int1Pattern, sizeof(int1Pattern));

      ULXR_COUT << ULXR_PCHAR("int2Pattern\n");
      testPattern(int2Pattern, sizeof(int2Pattern));

      ULXR_COUT << ULXR_PCHAR("doublePattern\n");
      testPattern(doublePattern, sizeof(doublePattern));

      ULXR_COUT << ULXR_PCHAR("stringPattern\n");
      testPattern(stringPattern, sizeof(stringPattern));

      ULXR_COUT << ULXR_PCHAR("base64Pattern\n");
      testPattern(base64Pattern, sizeof(base64Pattern));

      ULXR_COUT << ULXR_PCHAR("datePattern\n");
      testPattern(datePattern, sizeof(datePattern));

      ULXR_COUT << ULXR_PCHAR("struct1Pattern\n");
      testPattern(struct1Pattern, sizeof(struct1Pattern));

      ULXR_COUT << ULXR_PCHAR("struct2Pattern\n");
      testPattern(struct2Pattern, sizeof(struct2Pattern));

      ULXR_COUT << ULXR_PCHAR("arrayPattern\n");
      testPattern(arrayPattern, sizeof(arrayPattern));

      ULXR_COUT << ULXR_PCHAR("callPattern\n");
      testCallPattern(callPattern, sizeof(callPattern));

      ULXR_COUT << ULXR_PCHAR("emptyCallPattern\n");
      testCallPattern(emptyCallPattern, sizeof(emptyCallPattern));

      ULXR_COUT << ULXR_PCHAR("respPattern\n");
      testRespPattern(respPattern, sizeof(respPattern));

      ULXR_COUT << ULXR_PCHAR("implPattern\n");
      testPattern(implPattern, sizeof(implPattern));

      ULXR_COUT << ULXR_PCHAR("emptyArrayPattern\n");
      testRespPattern(emptyArrayPattern, sizeof(emptyArrayPattern));

      ULXR_COUT << ULXR_PCHAR("emptyRespPattern\n");
      testRespPattern(emptyRespPattern, sizeof(emptyRespPattern));

      ULXR_COUT << ULXR_PCHAR("emptyStructPattern\n");
      testRespPattern(emptyStructPattern, sizeof(emptyStructPattern));

      ULXR_COUT << ULXR_PCHAR("----------------------------------------------------\n");

      ULXR_COUT << ULXR_PCHAR("MethodResponse abc\n");

      ulxr::MethodResponse mr1(123, ULXR_PCHAR("faultstr_m"));
      ULXR_COUT << ulxr::binaryDebugOutput(mr1.getWbXml());
      ULXR_COUT << std::endl << mr1.getXml(0) << std::endl;

      ulxr::MethodResponse mr2(ulxr::Integer(1));
      ULXR_COUT << ulxr::binaryDebugOutput(mr2.getWbXml());
      ULXR_COUT << std::endl << mr2.getXml(0) << std::endl;

      ulxr::MethodResponse mr3;
      ULXR_COUT << ulxr::binaryDebugOutput(mr3.getWbXml());
      ULXR_COUT << std::endl << mr3.getXml(0) << std::endl;

      ULXR_COUT << ULXR_PCHAR("----------------------------------------------------\n");

      ulxr::MethodCall mc (ULXR_PCHAR("test.call"));
      ULXR_COUT << ulxr::binaryDebugOutput(mc.getWbXml());

      ULXR_COUT << std::endl << mc.getXml(0) << std::endl;

      ULXR_COUT << ULXR_PCHAR("====================================================\n");

      ulxr::Boolean b(true);
      ulxr::Integer i(123);
      ulxr::Double d(123.456);
      ulxr::RpcString s("<>&\"\'string<>&\"\'");
      ulxr::DateTime dt(ULXR_PCHAR("20020310T10:23:45"));
      ulxr::Base64 b64(ULXR_PCHAR("ABASrt466a90"));
      ulxr::Struct st;
      ulxr::Array ar;

      ULXR_COUT << ulxr::binaryDebugOutput(b.getWbXml()) << std::endl;
      ULXR_COUT << b.getXml(0) << std::endl;

      ULXR_COUT << ULXR_PCHAR("----------------------------------------------------\n");
      ULXR_COUT << ulxr::binaryDebugOutput(i.getWbXml()) << std::endl;
      ULXR_COUT << i.getXml(0) << std::endl;

      ULXR_COUT << ULXR_PCHAR("----------------------------------------------------\n");
      ULXR_COUT << ulxr::binaryDebugOutput(d.getWbXml()) << std::endl;
      ULXR_COUT << d.getXml(0) << std::endl;

      ULXR_COUT << ULXR_PCHAR("----------------------------------------------------\n");
      ULXR_COUT << ulxr::binaryDebugOutput(s.getWbXml()) << std::endl;
      ULXR_COUT << s.getXml(0) << std::endl;

      ULXR_COUT << ULXR_PCHAR("----------------------------------------------------\n");
      ULXR_COUT << ulxr::binaryDebugOutput(dt.getWbXml()) << std::endl;
      ULXR_COUT << dt.getXml(0) << std::endl;

      ULXR_COUT << ULXR_PCHAR("----------------------------------------------------\n");
      ULXR_COUT << ulxr::binaryDebugOutput(b64.getWbXml()) << std::endl;
      ULXR_COUT << b64.getXml(0) << std::endl;

      ULXR_COUT << ULXR_PCHAR("----------------------------------------------------\n");
      ULXR_COUT << ulxr::binaryDebugOutput(st.getWbXml()) << std::endl;
      ULXR_COUT << st.getXml(0) << std::endl;

      ULXR_COUT << ULXR_PCHAR("----------------------------------------------------\n");
      ULXR_COUT << ulxr::binaryDebugOutput(ar.getWbXml()) << std::endl;
      ULXR_COUT << ar.getXml(0) << std::endl;

      ULXR_COUT << ULXR_PCHAR("====================================================\n");

      ULXR_COUT << "wbToken_Value   " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_Value) << std::endl;
      ULXR_COUT << "wbToken_Array   " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_Array) << std::endl;
      ULXR_COUT << "wbToken_Data    " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_Data) << std::endl;
      ULXR_COUT << "wbToken_Struct  " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_Struct) << std::endl;
      ULXR_COUT << "wbToken_Member  " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_Member) << std::endl;
      ULXR_COUT << "wbToken_Name    " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_Name) << std::endl;
      ULXR_COUT << "wbToken_Boolean " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_Boolean) << std::endl;
      ULXR_COUT << "wbToken_Int     " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_Int) << std::endl;
      ULXR_COUT << "wbToken_I4      " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_I4) << std::endl;
      ULXR_COUT << "wbToken_Double  " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_Double) << std::endl;
      ULXR_COUT << "wbToken_String  " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_String) << std::endl;
      ULXR_COUT << "wbToken_Base64  " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_Base64) << std::endl;
      ULXR_COUT << "wbToken_Date    " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_Date) << std::endl;
      ULXR_COUT << std::endl;

      ULXR_COUT << "wbToken_MethodCall " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::MethodCallParserWb::wbToken_MethodCall) << std::endl;
      ULXR_COUT << "wbToken_MethodName " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::MethodCallParserWb::wbToken_MethodName) << std::endl;
      ULXR_COUT << "wbToken_Params     " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::MethodCallParserWb::wbToken_Params) << std::endl;
      ULXR_COUT << "wbToken_Param      " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::MethodCallParserWb::wbToken_Param) << std::endl;
      ULXR_COUT << std::endl;

      ULXR_COUT << "wbToken_MethodResponse " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::MethodResponseParserWb::wbToken_MethodResponse) << std::endl;
      ULXR_COUT << "wbToken_Fault          " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::MethodResponseParserWb::wbToken_Fault) << std::endl;
      ULXR_COUT << "wbToken_Params         " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::MethodResponseParserWb::wbToken_Params) << std::endl;
      ULXR_COUT << "wbToken_Param          " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::MethodResponseParserWb::wbToken_Param) << std::endl;
      ULXR_COUT << std::endl;

      ULXR_COUT << "wbToken_ValueParserLast "
                << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_ValueParserLast) << std::endl;

      ULXR_COUT << "wbToken_CallParserLast "
                << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::MethodCallParserWb::wbToken_CallParserLast) << std::endl;

      ULXR_COUT << "wbToken_ResponseParserLast "
                << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::MethodResponseParserWb::wbToken_ResponseParserLast) << std::endl;


    }

    catch(ulxr::Exception &ex)
    {
       ULXR_COUT << ULXR_PCHAR("Error occured: ")
                 << ULXR_GET_STRING(ex.why()) << std::endl;
       success= 1;
    }
#ifdef STRESS_IT
  }
#endif

  return success;
}
Esempio n. 9
0
string b64(string source) {
	return b64((uint8_t *) STR(source), source.size());
}
Esempio n. 10
0
int search_freedb (splt_state *state)
{
	int fd, i, tot=0;
	char buffer[BUFFERSIZE], message[1024], junk[1024];
	char *c, *e=NULL;
	FILE *output = NULL;
	struct sockaddr_in host;
	struct hostent *h;
	struct addr dest;
	cd_state *cdstate;

	if ((c=getenv("HOME"))!=NULL) sprintf(message, "%s/"PROXYCONFIG, c);
	else strncpy(message, PROXYCONFIG, strlen(PROXYCONFIG));

	if (!(output=fopen(message, "r"))) {
		if (!(output=fopen(message, "w+"))) {
			fprintf(stderr, "\nWARNING Can't open config file ");
			perror(message);
		}
		else {
			fprintf (stderr, "Will you use a proxy? (y/n): ");
			fgets(junk, 200, stdin);
			if (junk[0]=='y') {
				fprintf (stderr, "Proxy Address: ");
				fgets(junk, 200, stdin);
				fprintf (output, "PROXYADDR=%s", junk);
				fprintf (stderr, "Proxy Port: ");
				fgets(junk, 200, stdin);
				fprintf (output, "PROXYPORT=%s", junk);
				fprintf (stderr, "Need authentication? (y/n): ");
				fgets(junk, 200, stdin);
				if (junk[0]=='y') {
					fprintf (output, "PROXYAUTH=1\n");
					fprintf (stderr, "Would you like to save password (insecure)? (y/n): ");
					fgets(junk, 200, stdin);
					if (junk[0]=='y') {
						login (message);
						e = b64(message, strlen(message));
						fprintf (output, "%s\n", e);
						memset(message, 0x00, strlen(message));
						memset(e, 0x00, strlen(e));
						free(e);
					}
				}
			}
		}
	}

	dest = useproxy(output, dest);

	if (output != NULL)
		fclose(output);

	do {
		fprintf (stdout, "\n\t____________________________________________________________]");
		fprintf (stdout, "\r Search: [");
		fgets(junk, 800, stdin);
		junk[strlen(junk)-1]='\0';
	} while ((strlen(junk)==0)||(checkstring(junk)!=0));

	i=0;
	while ((junk[i]!='\0')&&(i<800))
		if (junk[i]==' ') junk[i++]='+';
		else i++;

	fprintf (stderr, "\nConnecting to %s...\n", dest.hostname);
	if((h=gethostbyname(dest.hostname))==NULL) {
		herror(dest.hostname);
		exit(1);
	}

	memset(&host, 0x0, sizeof(host));
	host.sin_family=AF_INET;
	host.sin_addr.s_addr=((struct in_addr *) (h->h_addr)) ->s_addr;

	host.sin_port=htons(dest.port);

	if((fd=socket(AF_INET, SOCK_STREAM, 0))==-1) {
		perror("socket");
		exit(1);
	}
	if ((connect(fd, (void *)&host, sizeof(host)))==-1) {
		perror("connect");
		exit(1);
	}

	if (dest.proxy) {
		sprintf(message,"GET http://www.freedb.org"SEARCH" "PROXYDLG, junk);
		if (dest.auth!=NULL)
			sprintf (message, "%s"AUTH"%s\n", message, dest.auth);
		strncat(message, "\n", 1);
	}
	else sprintf(message,"GET "SEARCH"\n", junk);

	if((send(fd, message, strlen(message), 0))==-1) {
		perror("send");
		exit(1);
	}
	fprintf (stderr, "Host contacted. Waiting for answer...\n");

	memset(buffer, 0x00, BUFFERSIZE);

	if ((cdstate = (cd_state *) malloc (sizeof(cd_state)))==NULL) {
		perror("malloc");
		exit(1);
	}

	cdstate->foundcd = 0;

	do {
		tot=0;
		c = buffer;
		do {
			i = recv(fd, c, BUFFERSIZE-(c-buffer)-1, 0);
			if (i==-1) break;
			tot += i;
			buffer[tot]='\0';
			c += i;
		} while ((i>0)&&(tot<BUFFERSIZE-1)&&((e=strstr(buffer, "</html>"))==NULL));

		tot = find_cd(buffer, tot, cdstate);
		if (tot==-1) continue;
		if (tot==-2) break;
	} while ((i>0)&&(e==NULL)&&(cdstate->foundcd<MAXCD));

	closesocket(fd);

	if (cdstate->foundcd<=0) {
		if (dest.proxy) {
			if (strstr(buffer, "HTTP/1.0")!=NULL) {
				if ((c = strchr (buffer, '\n'))!=NULL)
					buffer[c-buffer]='\0';
				fprintf (stderr, "Proxy Reply: %s\n", buffer);
			}
		}
		if (cdstate->foundcd==0) return -1;
		if (cdstate->foundcd==-1) return -2;
	}
	if (cdstate->foundcd==MAXCD) fprintf (stderr, "\nMax cd number reached, this search may be too generic.\n");

	fprintf (stdout, "\n");

	do {
		i=0;
		fprintf (stdout, "Select cd #: ");
		fgets(message, 254, stdin);
		message[strlen(message)-1]='\0';
		tot=0;
		if (message[tot]=='\0') i=-1;
		while(message[tot]!='\0')
			if (isdigit(message[tot++])==0) {
				fprintf (stdout, "Please ");
				i=-1;
				break;
			}
		if (i!=-1) i = atoi (message);
	} while ((i>=cdstate->foundcd) || (i<0));
	state->id.genre = getgenre(cdstate->discs[i].category);
	if (dest.proxy) {
		sprintf(message, "GET "FREEDBHTTP"cmd=cddb+read+%s+%s&hello=nouser+mp3splt.net+"NAME"+"VER"&proto=5 "PROXYDLG, 
			cdstate->discs[i].category, cdstate->discs[i].discid);
		if (dest.auth!=NULL) {
			sprintf (message, "%s"AUTH"%s\n", message, dest.auth);
			memset(dest.auth, 0x00, strlen(dest.auth));
			free(dest.auth);
		}
		strncat(message, "\n", 1);
	}
	else {
		sprintf(message, "CDDB READ %s %s\n", cdstate->discs[i].category, cdstate->discs[i].discid);
		host.sin_port=htons(PORT2);
	}

	fprintf (stderr, "\nContacting "FREEDB" to query selected cd...\n");

	if((fd=socket(AF_INET, SOCK_STREAM, 0))==-1) {
		perror("socket");
		exit(1);
	}
	if ((connect(fd, (void *)&host, sizeof(host)))==-1) {
		perror("connect");
		exit(1);
	}
	if (!dest.proxy) {
		i=recv(fd, buffer, BUFFERSIZE-1, 0);
		buffer[i]='\0';

		if (strncmp(buffer,"201",3)!=0)  return -4;
		if((send(fd, HELLO, strlen(HELLO), 0))==-1) {
			perror("send");
			exit(1);
		}
		i=recv(fd, buffer, BUFFERSIZE-1, 0);
		buffer[i]='\0';
		if (strncmp(buffer,"200",3)!=0)  return -4;
	}

	if((send(fd, message, strlen(message), 0))==-1) {
		perror("send");
		exit(1);
	}

	fprintf (stderr, "Host contacted. Waiting for answer...\n");

	memset(buffer, 0x00, BUFFERSIZE);
	c = buffer;
	tot=0;
	do {
		i = recv(fd, c, BUFFERSIZE-(c-buffer)-1, 0);
		if (i==-1) break;
		tot += i;
		buffer[tot]='\0';
		c += i;
	} while ((i>0)&&(tot<BUFFERSIZE-1)&&((e=strstr(buffer, "\n."))==NULL));

	if (!dest.proxy)
		if((send(fd, "quit\n", 5, 0))==-1) {
			perror("send");
			exit(1);
		}

	closesocket(fd);

	if (tot==0) return -4;

	if (e!=NULL)
		buffer[e-buffer+1]='\0';

	if ((strstr(buffer, "database entry follows"))==NULL) {
		if ((c = strchr (buffer, '\n'))!=NULL)
			buffer[c-buffer]='\0';
		fprintf (stderr, "Invalid server answer: %s\n", buffer);
		return -5;
	}
	else {
		if ((c = strchr (buffer, '#'))==NULL)
			return -5;
		if (!(output=fopen(CDDBFILE, "w"))) {
			perror(CDDBFILE);
			exit(1);
		}
		fprintf (output, c);
		fclose(output);
	}

	fprintf (stderr, "OK, "CDDBFILE" has been written.\n");
	
	free(cdstate);

	return 0;

}
Esempio n. 11
0
struct addr useproxy(FILE *in, struct addr dest)
{

	char line[270];
	char *ptr;

	dest.proxy=0;
	memset(dest.hostname, 0, 256);
	memset(line, 0, 270);

	if (in != NULL) {
	
		fseek(in, 0, SEEK_SET);

		if (fgets(line, 266, in)!=NULL) {
			if (strstr(line, "PROXYADDR")!=NULL) {
				line[strlen(line)-1]='\0';
				if ((ptr = strchr(line, '='))!=NULL) {
					ptr++;
					strncpy(dest.hostname, ptr, 255);
				}

				if (fgets(line, 266, in)!=NULL) {
					if (strstr(line, "PROXYPORT")!=NULL) {
						line[strlen(line)-1]='\0';
						if ((ptr = strchr(line, '='))!=NULL) {
							ptr++;
							dest.port = atoi (ptr);
							dest.proxy=1;
						}
						fprintf (stderr, "Using Proxy: %s on Port %d\n", dest.hostname, dest.port);
						if (fgets(line, 266, in)!=NULL) {
							if (strstr(line, "PROXYAUTH")!=NULL) {
								line[strlen(line)-1]='\0';
								if ((ptr = strchr(line, '='))!=NULL) {
									ptr++;
									if (ptr[0]=='1') {
										if (fgets(line, 266, in)!=NULL) {
											dest.auth = malloc(strlen(line)+1);
											if (dest.auth==NULL) {
												perror("malloc");
												exit(1);
											}
											memset(dest.auth, 0x0, strlen(line)+1);
											strncpy(dest.auth, line, strlen(line));
										}
										else {
											login(line);
											dest.auth = b64(line, strlen(line));
											memset(line, 0x00, strlen(line));
										}
									}
								}
							}
						}
						else dest.auth = NULL;
					}
				}
			}
		}
	}
	
	if (!dest.proxy) {
		strncpy(dest.hostname, FREEDB, 255);
		dest.port = PORT1;
	}

	return dest;
}