Protecting PDF file with password in Oracle PL/SQL - oracle

I need to ecrypt PDF file with password in Oracle Database 12c.
I have PDFs in BLOB column in database and I want to write function that returns BLOB which contains encrypted PDF.
Then if I save that pdf to disk and open it with Acrobat Reader I want to be prompt for password.
In most simple scenerio (which will be fine for now) I need something like this:
FUNCTION Encrypt_Pdf(
pdf_ IN BLOB,
password_ IN VARCHAR2
) RETURN BLOB
IS
encrypted_pdf_ BLOB;
BEGIN
-- do something with pdf_ to encrypt it with password_
RETURN encrypted_pdf_;
END Encrypt_Pdf;
I've looked for some free packages but I found only pl/pdf which is commercial :( other free solutions for PDFs in PL/SQL dont provide encryption (as_pdf3, pl_fpdf).
Do you have any idea how to do that?
Thanks

So I’ve found solution. I’ve loaded java library iText into database and wrote java package which encrypt and returns pdf as oracle.sql.BLOB then I’ve called it from plsql and it worked well.

Related

Oracle PL/SQL produce the same hash as PERL crypt

My company is in the middle of migrating their old application (perl) into their new application (oracle apex). We currently have all of our internal processes up and running on oracle apex, while all of our merchants still use the old application. I'm creating the merchant setup in apex (our support users set up merchant accounts for them), in which part of this setup I need to create the logins for the merchant to use. The problem is that our old application used the perl crypt function to hash our merchants passwords, so my custom hash in apex does not match the same digest thus not allowing the merchants to sign in. I'm wondering if I have the code to create the exact same salt as the old application, can oracle's DBMS_CRYPTO replicate the exact same hash as the perl crypt function? $cpw = crypt ($pw, $salt);
Update Sep 09 2022: To avoid a scheduled maintenance and having to import jars into the db, i'm looking into an alternative solution that involves taking the password hashing code out of the original application and re-creating it in it's own cgi file. Then using apex_web_service.make_rest_request to POST our user's password and have the script that contains the crypt() function handle hashing of the password.
If you have Java enabled in the database then you may be able to (untested):
Use the loadjava utility to import the apache.commons.codec library which contains the org.apache.commons.codec.digest.Crypt class.
Create a PL/SQL function to wrap the Java method:
CREATE OR REPLACE FUNCTION CRYPT(
i_key IN VARCHAR2,
i_salt IN VARCHAR2
) RETURN VARCHAR2
AS LANGUAGE JAVA
NAME 'org.apache.commons.codec.digest.Crypt.crypt(java.lang.String, java.lang.String) return java.lang.String';
/
Then you can call that function and compare it to Perl.

Oracle Apex 19.2: Cannot resolve the "schema is reserved or restricted" issue

I attempted to create a workspace in APEX using an existing schema called PEOPLE and it gave the error message "The schema is reserved or restricted". I tried with other existing schemas that I created and they all worked fine.
Technical/Environment details follow:
Database: Oracle 19c EE installed on local machine.
Apex: 19.2 installed as Embedded Gateway on local machine.
Created pluggable database called PDB1.
Created tablespace PEOPLE_TAB using OMF (Oracle Managed Files) syntax.
Created local user PEOPLE in PDB1.
Gave PEOPLE the following roles and privs (I'm aware some are doubled up like RESOURCE role and CREATE SESSION priv):
RESOURCE
UNLIMITED TABLESPACE
SELECT_CATALOG_ROLE
CREATE SESSION
CREATE TABLE
CREATE TYPE
CREATE CLUSTER
CREATE TRIGGER
CREATE PROCEDURE
CREATE SEQUENCE
CREATE VIEW
CREATE DIMENSION
CREATE JOB
CREATE SYNONYM
CREATE DIMENSION
CREATE MATERIALIZED VIEW
I created another user TEST1 in the same tablespace PEOPLE_TAB, with the same privs as PEOPLE and re-created the objects and data. I could successfully create a workspace using this new schema!
Trawled the web, but most articles and posts refer to older versions of APEX, but I still tried the following.
I followed the advice given in the Oracle docs, Application Express Release 19.2 Adminstration Guide section 2.13
The APEX engine schema for APEX 19.2 is APEX_190200. So I unlocked APEX_190200 and logged in (after changing password) to run the checks.
-- Checked if PEOPLE was a restricted schema
SELECT schema FROM APEX_190200.wwv_flow_restricted_schemas order by schema;
PEOPLE is not listed and I assume is not restricted. So I tried to unrestrict PEOPLE anyway as detailed in the docs.
-- ran from APEX_190200
EXEC APEX_INSTANCE_ADMIN.UNRESTRICT_SCHEMA(p_schema => 'PEOPLE');
COMMIT;
Successfully ran but did not resolve the issue.
Looking on the web most of the info was out of date but tried anyway.
-- ran from APEX_190200
EXEC APEX_SITE_ADMIN_PRIVS.UNRESTRICT_SCHEMA(p_schema => 'PEOPLE');
COMMIT;
The above did not run and complained the package didn't exist. I verified that when looking for APEX_SITE_ADMIN_PRIVS in user_objects - it was not there.
Some years ago there was a bug with the function wwv_flow_provision.IS_RESERVED, but I checked this and it ran ok returning FALSE for PEOPLE and TRUE for reserved words like VARCHAR.
It's really thrown me when I can create an identical user (different name) with identical privs, objects and data was created on the same tablespace and it worked fine with an APEX workspace.
Does anyone have any experience of resolving this issue or point me in the right direction?
Thank you.
You are receiving the error because PEOPLE is specified as a restricted schema with an APEX package.
In the installation scripts for APEX 19.2, the file named f4050.sql has a page validation on page 79 (the page that is raising the error) that looks like this:
...
...
...
wwv_flow_api.create_page_validation(
p_id=>wwv_flow_api.id(114752711027135415)
,p_validation_name=>'schema not reserved/restricted'
,p_validation_sequence=>80
,p_validation=>wwv_flow_string.join(wwv_flow_t_varchar2(
'wwv_flow_provision.schema_name_valid(',
' p_schema => :F4050_P79_SCHEMA,',
' p_workspace_name => :F4050_P27_COMPANY);'))
,p_validation_type=>'PLSQL_EXPRESSION'
,p_error_message=>'Schema is reserved or restricted'
,p_when_button_pressed=>wwv_flow_api.id(12559200978895311)
,p_error_display_location=>'INLINE_WITH_FIELD_AND_NOTIFICATION'
);
...
...
...
Then using a procedure block like this, you can determine if the schema name is valid or not:
BEGIN
IF apex_190200.wwv_flow_provision.schema_name_valid (p_schema => 'PEOPLE',
p_workspace_name => 'PEOPLE')
THEN
DBMS_OUTPUT.put_line ('Valid');
ELSE
DBMS_OUTPUT.put_line ('Invalid');
END IF;
END;
/
Then by unwrapping the code in those packages (tools can be easily found online). Within that code, there is a call to another function named WWV_FLOW_PROVISIONING.RESERVED_SCHEMA (P_SCHEMA => P_SCHEMA). Within that function, there is code that looks like this:
IF C_SCHEMA IN (
'HTMLDB_PUBLIC_USER',
'APEX_PUBLIC_USER',
'PUBLIC_USER',
'FLOWS_FILES',
'SCHEDULER',
'PEOPLE') THEN
RETURN TRUE;
END IF;
So without modifying the package WWV_FLOW_PROVISIONING (which I would highly recommend AGAINST), you will not be able to create an APEX workspace with the schema name PEOPLE. This will need to be fixed by Oracle either through a patch to the package or in a newer version of APEX.
Fascinating issue. The restricted schema is hard-coded in APEX provisioning code. It's very much a legacy issue.
We can attempt to fix this in the next release of APEX, but that won't help you now. If you file a Service Request for Oracle Support, I'll make sure you get a fix for this issue (assuming you're using a supported version of APEX).

Laravel - export db rows to sqlite format

We have a website based on Laravel 5.3 and a mobile app that can work offline. Laravel is using MySQL database.
I need to synchronize data between web and mobile app. Mobile app would make a request with a timestamp, and API would send all data changed since that timestamp.
My mobile developer said it would be easiest for him to receive the data as a single sqlite database file. So my question is:
is there a way in Laravel to export selected data to valid sqlite format?
sqlite format
Laravel got nothing to do with whatever your database server is. All you need to do is to dump your current database as pure SQL (i.e. using phpmyadmin) and import to sqlite database. If needed you can use tools like http://sqlitebrowser.org/ to import your dump and then hand your dev .sqlite binary file which shall work too.
I ended up by creating an Artisan command that dumps selected tables to sql and then converts it to sqlite using this script
So the whole code in my command looks like that:
exec('mysqldump -P ... login credentials ... tables to export ...'.storage_path('app/export/dump.sql'));
exec('mysql2sqlite '
. storage_path('app/export/dump.sql') . ' '
. storage_path('app/export/sqlite.db')
);

Unable to use XMLTYPE in Oracle PL/SQL web service

I have been trying to provide my Oracle PL/SQL package as a web service in Oracle 11g (11.2.0.2.0). While everything else is going well, I seem to have a problem in using any procedure/function that uses XMLTYPE over the web service. While I would be very surprised, if XMLTYPE was not supported in Oracle web service, and also because I haven't found any resources that indicated such limitation, I believe I'm doing something wrong. However, I cannot figure out where the problem would be and therefore the question.
I have configured a native web service in my Oracle database according to Native Oracle XML DB Web Services in Oracle 11g Release 1 and I have been successful in testing procedures with basic datatypes using SoapUI.
To rule out any other sources for the problem I created the following minimized test package that reproduces the problem:
CREATE OR REPLACE PACKAGE web_test_package AUTHID CURRENT_USER AS
PROCEDURE xmltype_test (dummy IN varchar2);
END;
/
CREATE OR REPLACE PACKAGE BODY web_test_package AS
PROCEDURE xmltype_test (dummy IN varchar2)
IS
xt XmlType;
BEGIN
select XMLTYPE('<MyXmlTag></MyXmlTag>') into xt from dual;
END xmltype_test;
END;
/
If I now run the defined procedure in SQLPlus, it runs nicely:
SQL> exec web_test_package.xmltype_test;
PL/SQL procedure successfully completed.
When the service is configured and the package has been defined into the database, I can get the WSDL for the package from http://host:port/orawsv/DBSCHEMA/WEB_TEST_PACKAGE?wsdl. Using the WSDL I create a SoapUI project, which contains a sample request. Then I configure the request to use Basic Authentication, and I'm ready to test the query.
When running the query with SoapUI, I get the following errors in the response:
<OracleError>
<ErrorNumber>ORA-19202</ErrorNumber>
<Message>Error occurred in XML processing</Message>
</OracleError>
<OracleError>
<ErrorNumber>ORA-00904</ErrorNumber>
<Message>: invalid identifier</Message>
</OracleError>
<OracleError>
<ErrorNumber>ORA-06512</ErrorNumber>
<Message>at "MY_USER.WEB_TEST_PACKAGE", line 6</Message>
</OracleError>
<OracleError>
<ErrorNumber>ORA-06512</ErrorNumber>
<Message>at line 1</Message>
</OracleError>
If I now interpret the errors correctly, they mean that I get the error ORA-00904 "invalid identifier" on the line where I have my select-clause. And in my understanding "XMLTYPE" is the only identifier on that line, which means that it is not recognized when the procedure is executed through the web service.
So finally the question: Is there a limitation that XMLTYPE cannot be used in procedures that are called through web service? Or am I missing something here?
For the record, I have also tried to replace the constructor format XMLTYPE(...) with method format XMLTYPE.CreateXML(...), but that didn't help.
I was finally able to solve my issue. The solution consisted of two parts:
Firstly, I needed to give my web service user the following permission:
grant XDB_WEBSERVICES_WITH_PUBLIC to my_user;
This was in comments in some guides that I used, but apparently it is required for the XMLTYPE to be visible for a session launched by the web service.
Secondly I learned that having XMLTYPE as a return type of a function is a problem, when the function is called by a web service. I had one function like that and the solution was to change its return type to CLOB and add the following conversion in the end of it.
RETURN return_xml.getClobVal();
This returns the return value nicely as XML to my SOAPUI request.
Edit. There seems to be a limit of 4000 chars in returning CLOB from Oracle native web service. This can be awkwardly resolved by casting it back to XMLTYPE. So to correctly return XML from Oracle native web service, you will actually need to do the following:
RETURN XMLTYPE(return_xml.getClobVal());
Even though looking odd, this back and forth casting changes the format of the XMLTYPE enough so that it can be returned nicely and without character limitation.

How to write a datatable to excel work book at client side

Currently i am doing one project in that we need to generate report from database.
Since my server memory is too low im getting 'Out of Memory' Exception when im writing it at serverside and also when i write directly to a excel file using http header as excel file im not able to create multiple sheets since my database table is huge more than 65536 rows.
I saw many solution using a third party tool but i cant use those into mine..If anyone already worked on this please give me some direction.
Also i tried using javascript but for that i need to use datagrid at server side??
but in my project i m not allowed to use like this.
You can open an excel file, as an xml document using the Open XML format SDK: http://msdn.microsoft.com/en-us/library/bb448854.aspx

Resources