Click here to close now.

Welcome!

.NET Authors: Aria Blog, Pat Romanski, Elizabeth White, Hovhannes Avoyan, Sanjeev Sharma

Related Topics: PowerBuilder, .NET, SAP

PowerBuilder: Article

DataWindow Magic: Menu Security

Designing and implementing your own

Security is a must for most corporate applications. This article will give you a starting point to designing and implementing your own. We will do it with a table that is added to the example database and implement it in ancestor code. The idea is that you should only have to add rows to a table to implement your security.

The Table
The security table will provide a means to turn on and off controls and menu items as our inherited objects are constructed.

Security

Login_name varchar(20) PK

Application varchar(20) PK

Item_type varchar(10) PK

Item_name varchar(20) PK

Priviledge varchar(2)

 

Security

Column Name

Data Type

Description

Login_name

Varchar(20) PK

The login name of the user

Application

Varchar(20) PK

The name of the application

Item_type

Varchar(10) PK

Might be window or menu or a type of control in a window like a command button. We will only cover menu types in this article.

Item_name

Varchar(60) PK

Menu item name like "File" or "New"

Priviledge

Char(2)

NULL = no priviledges

R = read only

I = Invisible

W = read/write

The Item Datastore
Although I had several choices I decided to create a datastore that would return all of the specified item types for an application. If I was in a menu I could look for menus. If I was in a window I could look for windows.

Ds_security_list data source

SELECT "security"."application",  
"security"."item_name",  
"security"."priviledge",  
"security"."login_name" 
FROM "security" 
WHERE ( "security"."item_type" = :as_itemType ) AND 
( "security"."application" = :as_appName ) AND 
"security"."login_name" = :as_loginName

This will give you all the items and privileges for the supplied application name and itemtype.

Now that we have this we can start our menu.

The Root Menu
Menus don't have constructors. We are going to implement our security with a function. I created a new menu and added a function called mf_loadSecurity.

Here is the code for mf_loadSecurity

M_root.mf_loadSecurity(as_loginName, as_appName)

// First get a list of all menu security items
datastore lds
lds = create datastore
lds.dataobject = "ds_security_list"
lds.settransobject( sqlca)

// Now retrieve
long ll_row, ll_max
ll_max = lds.retrieve(as_loginName, as_appName, "menu")

Let's discuss this code a little before we continue. As you'll see, handling a menu programmatically, for any reason, is necessarily complex.

The menu object has an array of items in it. Each of those items is another menu item that also has its array of items.

If the array of items in any particular menu item has no elements, then that is a bottom level menu item. If there are elements in the array then those elements compose the sub-menu for that menu item.

You might want to read the last couple of paragraphs a few times. Here, let me give you an example.

For my article I created a menu object inherited from m_root and named m_main that looks something like the following:

I didn't want to confuse the issue too much so I put in only the File menu option along the top. Under File I put New and Exit. Under New I put Test 1, Test 2, and Test 3.

Here is how the menu looks in the menu painter.

Note that I have an item called Invisible in the menu. This comes from m_root. I put it there to implement system-wide shortcuts. The visible property for this is FALSE.

For our test we are only concerned with the Test 1, Test 2, and Test 3 menu items. I am going to make Test 1 read-only and Test 2 invisible.

Since we have this metaphor of arrays of menu items within menu items we are forced to use recursion. Don't worry, though, we'll walk through it.

Recursion
Recursion has been known to throw even the bravest programmer into fits of apprehension. Essentially we need two functions. One just fires off the recursive function for every element in its item array. The recursive function will check to see if the arguments to itself are a match. If so, it returns itself. If they are not then it loops through its own item array, calling itself for each element.

The function mf_loadSecurity calls the recursive function. The first part loads the datastore that holds the security list. We have already defined that. The mf_loadSecurity takes two arguments. Those are the arguments that are used to retrieve that array.

Once we retrieve that datastore we have a row for every row in the security table that matches the login name of the user and the application name has an item_type of ‘menu'. At this point we are not worried about the window security. The mf_loadSecurity will loop through all of those to work its magic.

Note that I could have gone the opposite route and looped through each and every menu item recursively then done a singleton select in each one. I chose the former because I think it will be rare that we will have a row for all of the menu items and thus this will be a faster response time. Here we do one call to the server for the result set rather than one call for every menu item.

I loop through every row. I extract the privilege and the item name for each row. I call the recursive function for each row, looking for the item. I pass myself and the item name.

The recursive function mf_findMenuItem will return the found menu item or a null. If it is a null then the menu item was not found.

If the item was indeed found then I set the appropriate property for that menu item (depending on the privilege that I just read).

If you look closely at the code for mf_loadSecurity while reading the explanation you should be able to understand rather easily.

mf_findMenuItem
mf_findMenuItem is the recursive function. It calls itself from within itself. Recursion is not terribly complicatee but you have to remember to give yourself some way to unwind from the function otherwise you waste a lot of processing.

M_root.mf_findMenuItem(menu amenu, string as_name)

//Are we there yet?
if amenu.text = as_name then
return amenu // Yes, we are... let's go home
end if
// This wasn't a match, we have to look in the item array

long ll_row, ll_max
menu lmenu_return // the return value
setNull(lmenu_return) // default to null

// Loop through the item array

ll_max = upperBound(amenu.item)
for ll_row = 1 to ll_max
// Call myself for every element in the array

lmenu_return = mf_findMenuItem(amenu.item[ll_row], as_name)
if isNull(lmenu_return) then
// It was not a match, look in the next element
else
return lmenu_return // We got a match, time to unwind
end if
next

// No match in the entire item array, sorry about that.
return lmenu_return

The comments should make this fairly obvious but I'll walk you through it anyway.

We have two arguments. One is the menu that we would like to search. Remember, it has its own item array. First we check to see if this menu item is a match. If it is then we're done. If it's not then we have to search every element in the item array for a match.

That's basically all there is to it.

Insert Security Rows in the Database
Next we need to insert the two rows in the database that will let us have the effect we want. One row has to set the ‘Test 1' menu item to read-only and the other sets ‘Test 2' to invisible.

Rows for our security table

INSERT INTO "security" 
( "login_name",  
"application",  
"item_type",  
"item_name",  
"priviledge" ) 
VALUES ( 'dba',  
'security_test',  
'menu',  
'Test 1',  
'R' )  ;

INSERT INTO "security" 
( "login_name",  
"application",  
"item_type",  
"item_name",  
"priviledge" ) 
VALUES ( 'dba',  
'security_test',  
'menu',  
'Test 2',  
'I' )  ;

Implementing the Menu Security
Now we inherit a window from w_root and we give it the m_main menu. Then we go to the open event of w_root and put in the following code:

W_main.open

m_root lmenu
lmenu = this.menuid
lmenu.mf_loadsecurity("dba" , "security_test" )

This should be pretty self-explanatory. You might not be aware of what the second line means. The menuid property of any window is the menu object that is assigned to that window.

You might wonder why I would add this code to the open event and not the ue_postOpen. The answer lies in the functionality of the open even and ue_postOpen.

The open event happens before the drawing of the window. The ue_postOpen is posted in the ancestor window (w_root) and therefore happens after the window is drawn. In our case we don't want the window to be displayed until after the security happens so this is one of the very rare instances where we want code in the open as opposed to the postOpen events.

The Final Touch
Lastly we have to add the code for the Application open event to fire everything off.

Application open event

// Profile EAS Demo DB V115
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.DBParm = "ConnectString='DSN=EAS Demo DB V115;UID=dba;PWD=sql'"
connect using sqlca;

open(w_main)

Of Course There Is Always More
If you think about the menu security you will soon realize that we don't allow for duplicate menu texts. Only the first match to a text will be found. We could change this by comparing the menu name rather than text. That would be something like m_root.m_file.m_new.Test1. That won't be a hard change if you want to do it yourself.

You could also use this metaphor to implement window level security. Using the same table then looping through the control array for the window in the open event looking for window controls that are in the security table for the user name and application. That should be simple enough for you now that you know how to do it.

NOTE: The code in this article uses my proprietary tools.pbl. You can reproduce it or you can write me asking for both the source of this article and the tools pbl as well. My e-mail address is at the bottom of the article.

Also, all the data for the application comes from the sample database that comes with PowerBuilder. That is the database that almost all of my readers have. I have had to expand the table though to support the needs of this article.

More Stories By Richard (Rik) Brooks

Rik Brooks has been programming in PowerBuilder since the final beta release before version 1. He has authored or co-authored five books on PowerBuilder including “The Definitive DataWindow”. Currently he lives in Mississippi and works in Memphis, Tennessee.

Comments (0)

Share your thoughts on this story.

Add your comment
You must be signed in to add a comment. Sign-in | Register

In accordance with our Comment Policy, we encourage comments that are on topic, relevant and to-the-point. We will remove comments that include profanity, personal attacks, racial slurs, threats of violence, or other inappropriate material that violates our Terms and Conditions, and will block users who make repeated violations. We ask all readers to expect diversity of opinion and to treat one another with dignity and respect.


@ThingsExpo Stories
Roberto Medrano, Executive Vice President at SOA Software, had reached 30,000 page views on his home page - http://RobertoMedrano.SYS-CON.com/ - on the SYS-CON family of online magazines, which includes Cloud Computing Journal, Internet of Things Journal, Big Data Journal, and SOA World Magazine. He is a recognized executive in the information technology fields of SOA, internet security, governance, and compliance. He has extensive experience with both start-ups and large companies, having been involved at the beginning of four IT industries: EDA, Open Systems, Computer Security and now SOA.
The industrial software market has treated data with the mentality of “collect everything now, worry about how to use it later.” We now find ourselves buried in data, with the pervasive connectivity of the (Industrial) Internet of Things only piling on more numbers. There’s too much data and not enough information. In his session at @ThingsExpo, Bob Gates, Global Marketing Director, GE’s Intelligent Platforms business, to discuss how realizing the power of IoT, software developers are now focused on understanding how industrial data can create intelligence for industrial operations. Imagine ...
Operational Hadoop and the Lambda Architecture for Streaming Data Apache Hadoop is emerging as a distributed platform for handling large and fast incoming streams of data. Predictive maintenance, supply chain optimization, and Internet-of-Things analysis are examples where Hadoop provides the scalable storage, processing, and analytics platform to gain meaningful insights from granular data that is typically only valuable from a large-scale, aggregate view. One architecture useful for capturing and analyzing streaming data is the Lambda Architecture, representing a model of how to analyze rea...
SYS-CON Events announced today that Vitria Technology, Inc. will exhibit at SYS-CON’s @ThingsExpo, which will take place on June 9-11, 2015, at the Javits Center in New York City, NY. Vitria will showcase the company’s new IoT Analytics Platform through live demonstrations at booth #330. Vitria’s IoT Analytics Platform, fully integrated and powered by an operational intelligence engine, enables customers to rapidly build and operationalize advanced analytics to deliver timely business outcomes for use cases across the industrial, enterprise, and consumer segments.
The explosion of connected devices / sensors is creating an ever-expanding set of new and valuable data. In parallel the emerging capability of Big Data technologies to store, access, analyze, and react to this data is producing changes in business models under the umbrella of the Internet of Things (IoT). In particular within the Insurance industry, IoT appears positioned to enable deep changes by altering relationships between insurers, distributors, and the insured. In his session at @ThingsExpo, Michael Sick, a Senior Manager and Big Data Architect within Ernst and Young's Financial Servi...
SYS-CON Events announced today that Open Data Centers (ODC), a carrier-neutral colocation provider, will exhibit at SYS-CON's 16th International Cloud Expo®, which will take place June 9-11, 2015, at the Javits Center in New York City, NY. Open Data Centers is a carrier-neutral data center operator in New Jersey and New York City offering alternative connectivity options for carriers, service providers and enterprise customers.
The explosion of connected devices / sensors is creating an ever-expanding set of new and valuable data. In parallel the emerging capability of Big Data technologies to store, access, analyze, and react to this data is producing changes in business models under the umbrella of the Internet of Things (IoT). In particular within the Insurance industry, IoT appears positioned to enable deep changes by altering relationships between insurers, distributors, and the insured. In his session at @ThingsExpo, Michael Sick, a Senior Manager and Big Data Architect within Ernst and Young's Financial Servi...
PubNub on Monday has announced that it is partnering with IBM to bring its sophisticated real-time data streaming and messaging capabilities to Bluemix, IBM’s cloud development platform. “Today’s app and connected devices require an always-on connection, but building a secure, scalable solution from the ground up is time consuming, resource intensive, and error-prone,” said Todd Greene, CEO of PubNub. “PubNub enables web, mobile and IoT developers building apps on IBM Bluemix to quickly add scalable realtime functionality with minimal effort and cost.”
Sensor-enabled things are becoming more commonplace, precursors to a larger and more complex framework that most consider the ultimate promise of the IoT: things connecting, interacting, sharing, storing, and over time perhaps learning and predicting based on habits, behaviors, location, preferences, purchases and more. In his session at @ThingsExpo, Tom Wesselman, Director of Communications Ecosystem Architecture at Plantronics, will examine the still nascent IoT as it is coalescing, including what it is today, what it might ultimately be, the role of wearable tech, and technology gaps stil...
In the consumer IoT, everything is new, and the IT world of bits and bytes holds sway. But industrial and commercial realms encompass operational technology (OT) that has been around for 25 or 50 years. This grittier, pre-IP, more hands-on world has much to gain from Industrial IoT (IIoT) applications and principles. But adding sensors and wireless connectivity won’t work in environments that demand unwavering reliability and performance. In his session at @ThingsExpo, Ron Sege, CEO of Echelon, will discuss how as enterprise IT embraces other IoT-related technology trends, enterprises with i...
When it comes to the Internet of Things, hooking up will get you only so far. If you want customers to commit, you need to go beyond simply connecting products. You need to use the devices themselves to transform how you engage with every customer and how you manage the entire product lifecycle. In his session at @ThingsExpo, Sean Lorenz, Technical Product Manager for Xively at LogMeIn, will show how “product relationship management” can help you leverage your connected devices and the data they generate about customer usage and product performance to deliver extremely compelling and reliabl...
The Internet of Things (IoT) is causing data centers to become radically decentralized and atomized within a new paradigm known as “fog computing.” To support IoT applications, such as connected cars and smart grids, data centers' core functions will be decentralized out to the network's edges and endpoints (aka “fogs”). As this trend takes hold, Big Data analytics platforms will focus on high-volume log analysis (aka “logs”) and rely heavily on cognitive-computing algorithms (aka “cogs”) to make sense of it all.
With several hundred implementations of IoT-enabled solutions in the past 12 months alone, this session will focus on experience over the art of the possible. Many can only imagine the most advanced telematics platform ever deployed, supporting millions of customers, producing tens of thousands events or GBs per trip, and hundreds of TBs per month. With the ability to support a billion sensor events per second, over 30PB of warm data for analytics, and hundreds of PBs for an data analytics archive, in his session at @ThingsExpo, Jim Kaskade, Vice President and General Manager, Big Data & Ana...
One of the biggest impacts of the Internet of Things is and will continue to be on data; specifically data volume, management and usage. Companies are scrambling to adapt to this new and unpredictable data reality with legacy infrastructure that cannot handle the speed and volume of data. In his session at @ThingsExpo, Don DeLoach, CEO and president of Infobright, will discuss how companies need to rethink their data infrastructure to participate in the IoT, including: Data storage: Understanding the kinds of data: structured, unstructured, big/small? Analytics: What kinds and how responsiv...
Since 2008 and for the first time in history, more than half of humans live in urban areas, urging cities to become “smart.” Today, cities can leverage the wide availability of smartphones combined with new technologies such as Beacons or NFC to connect their urban furniture and environment to create citizen-first services that improve transportation, way-finding and information delivery. In her session at @ThingsExpo, Laetitia Gazel-Anthoine, CEO of Connecthings, will focus on successful use cases.
Sensor-enabled things are becoming more commonplace, precursors to a larger and more complex framework that most consider the ultimate promise of the IoT: things connecting, interacting, sharing, storing, and over time perhaps learning and predicting based on habits, behaviors, location, preferences, purchases and more. In his session at @ThingsExpo, Tom Wesselman, Director of Communications Ecosystem Architecture at Plantronics, will examine the still nascent IoT as it is coalescing, including what it is today, what it might ultimately be, the role of wearable tech, and technology gaps stil...
The true value of the Internet of Things (IoT) lies not just in the data, but through the services that protect the data, perform the analysis and present findings in a usable way. With many IoT elements rooted in traditional IT components, Big Data and IoT isn’t just a play for enterprise. In fact, the IoT presents SMBs with the prospect of launching entirely new activities and exploring innovative areas. CompTIA research identifies several areas where IoT is expected to have the greatest impact.
Wearable devices have come of age. The primary applications of wearables so far have been "the Quantified Self" or the tracking of one's fitness and health status. We propose the evolution of wearables into social and emotional communication devices. Our BE(tm) sensor uses light to visualize the skin conductance response. Our sensors are very inexpensive and can be massively distributed to audiences or groups of any size, in order to gauge reactions to performances, video, or any kind of presentation. In her session at @ThingsExpo, Jocelyn Scheirer, CEO & Founder of Bionolux, will discuss ho...
SYS-CON Events announced today that GENBAND, a leading developer of real time communications software solutions, has been named “Silver Sponsor” of SYS-CON's WebRTC Summit, which will take place on June 9-11, 2015, at the Javits Center in New York City, NY. The GENBAND team will be on hand to demonstrate their newest product, Kandy. Kandy is a communications Platform-as-a-Service (PaaS) that enables companies to seamlessly integrate more human communications into their Web and mobile applications - creating more engaging experiences for their customers and boosting collaboration and productiv...
From telemedicine to smart cars, digital homes and industrial monitoring, the explosive growth of IoT has created exciting new business opportunities for real time calls and messaging. In his session at @ThingsExpo, Ivelin Ivanov, CEO and Co-Founder of Telestax, shared some of the new revenue sources that IoT created for Restcomm – the open source telephony platform from Telestax. Ivelin Ivanov is a technology entrepreneur who founded Mobicents, an Open Source VoIP Platform, to help create, deploy, and manage applications integrating voice, video and data. He is the co-founder of TeleStax, a...