Welcome!

Microsoft Cloud Authors: David H Deans, Pat Romanski, Janakiram MSV, Jnan Dash, Andreas Grabner

Related Topics: PowerBuilder, Microsoft Cloud, Artificial Intelligence

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
SYS-CON Events announced today that CA Technologies has been named “Platinum Sponsor” of SYS-CON's 20th International Cloud Expo®, which will take place on June 6-8, 2017, at the Javits Center in New York City, NY, and the 21st International Cloud Expo®, which will take place October 31-November 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. CA Technologies helps customers succeed in a future where every business – from apparel to energy – is being rewritten by software. From ...
More and more brands have jumped on the IoT bandwagon. We have an excess of wearables – activity trackers, smartwatches, smart glasses and sneakers, and more that track seemingly endless datapoints. However, most consumers have no idea what “IoT” means. Creating more wearables that track data shouldn't be the aim of brands; delivering meaningful, tangible relevance to their users should be. We're in a period in which the IoT pendulum is still swinging. Initially, it swung toward "smart for smart...
SYS-CON Events announced today that Dataloop.IO, an innovator in cloud IT-monitoring whose products help organizations save time and money, has been named “Bronze Sponsor” of SYS-CON's 20th International Cloud Expo®, which will take place on June 6-8, 2017, at the Javits Center in New York City, NY. Dataloop.IO is an emerging software company on the cutting edge of major IT-infrastructure trends including cloud computing and microservices. The company, founded in the UK but now based in San Fran...
Why do your mobile transformations need to happen today? Mobile is the strategy that enterprise transformation centers on to drive customer engagement. In his general session at @ThingsExpo, Roger Woods, Director, Mobile Product & Strategy – Adobe Marketing Cloud, covered key IoT and mobile trends that are forcing mobile transformation, key components of a solid mobile strategy and explored how brands are effectively driving mobile change throughout the enterprise.
SYS-CON Events announced today that delaPlex will exhibit at SYS-CON's @CloudExpo, which will take place on June 6-8, 2017, at the Javits Center in New York City, NY. delaPlex pioneered Software Development as a Service (SDaaS), which provides scalable resources to build, test, and deploy software. It’s a fast and more reliable way to develop a new product or expand your in-house team.
In his General Session at 17th Cloud Expo, Bruce Swann, Senior Product Marketing Manager for Adobe Campaign, explored the key ingredients of cross-channel marketing in a digital world. Learn how the Adobe Marketing Cloud can help marketers embrace opportunities for personalized, relevant and real-time customer engagement across offline (direct mail, point of sale, call center) and digital (email, website, SMS, mobile apps, social networks, connected objects).
Data is the fuel that drives the machine learning algorithmic engines and ultimately provides the business value. In his session at 20th Cloud Expo, Ed Featherston, director/senior enterprise architect at Collaborative Consulting, will discuss the key considerations around quality, volume, timeliness, and pedigree that must be dealt with in order to properly fuel that engine.
"Matrix is an ambitious open standard and implementation that's set up to break down the fragmentation problems that exist in IP messaging and VoIP communication," explained John Woolf, Technical Evangelist at Matrix, in this SYS-CON.tv interview at @ThingsExpo, held Nov 4–6, 2014, at the Santa Clara Convention Center in Santa Clara, CA.
Web Real-Time Communication APIs have quickly revolutionized what browsers are capable of. In addition to video and audio streams, we can now bi-directionally send arbitrary data over WebRTC's PeerConnection Data Channels. With the advent of Progressive Web Apps and new hardware APIs such as WebBluetooh and WebUSB, we can finally enable users to stitch together the Internet of Things directly from their browsers while communicating privately and securely in a decentralized way.
"A lot of times people will come to us and have a very diverse set of requirements or very customized need and we'll help them to implement it in a fashion that you can't just buy off of the shelf," explained Nick Rose, CTO of Enzu, in this SYS-CON.tv interview at 18th Cloud Expo, held June 7-9, 2016, at the Javits Center in New York City, NY.
You think you know what’s in your data. But do you? Most organizations are now aware of the business intelligence represented by their data. Data science stands to take this to a level you never thought of – literally. The techniques of data science, when used with the capabilities of Big Data technologies, can make connections you had not yet imagined, helping you discover new insights and ask new questions of your data. In his session at @ThingsExpo, Sarbjit Sarkaria, data science team lead ...
The Internet of Things will challenge the status quo of how IT and development organizations operate. Or will it? Certainly the fog layer of IoT requires special insights about data ontology, security and transactional integrity. But the developmental challenges are the same: People, Process and Platform and how we integrate our thinking to solve complicated problems. In his session at 19th Cloud Expo, Craig Sproule, CEO of Metavine, demonstrated how to move beyond today's coding paradigm and sh...
Big Data, cloud, analytics, contextual information, wearable tech, sensors, mobility, and WebRTC: together, these advances have created a perfect storm of technologies that are disrupting and transforming classic communications models and ecosystems. In his session at @ThingsExpo, Erik Perotti, Senior Manager of New Ventures on Plantronics’ Innovation team, provided an overview of this technological shift, including associated business and consumer communications impacts, and opportunities it m...
WebRTC is about the data channel as much as about video and audio conferencing. However, basically all commercial WebRTC applications have been built with a focus on audio and video. The handling of “data” has been limited to text chat and file download – all other data sharing seems to end with screensharing. What is holding back a more intensive use of peer-to-peer data? In her session at @ThingsExpo, Dr Silvia Pfeiffer, WebRTC Applications Team Lead at National ICT Australia, looked at differ...
With major technology companies and startups seriously embracing IoT strategies, now is the perfect time to attend @ThingsExpo 2016 in New York. Learn what is going on, contribute to the discussions, and ensure that your enterprise is as "IoT-Ready" as it can be! Internet of @ThingsExpo, taking place June 6-8, 2017, at the Javits Center in New York City, New York, is co-located with 20th Cloud Expo and will feature technical sessions from a rock star conference faculty and the leading industry p...
SYS-CON Events announced today that IoT Now has been named “Media Sponsor” of SYS-CON's 20th International Cloud Expo, which will take place on June 6–8, 2017, at the Javits Center in New York City, NY. IoT Now explores the evolving opportunities and challenges facing CSPs, and it passes on some lessons learned from those who have taken the first steps in next-gen IoT services.
SYS-CON Events announced today that WineSOFT will exhibit at SYS-CON's 20th International Cloud Expo®, which will take place on June 6-8, 2017, at the Javits Center in New York City, NY. Based in Seoul and Irvine, WineSOFT is an innovative software house focusing on internet infrastructure solutions. The venture started as a bootstrap start-up in 2010 by focusing on making the internet faster and more powerful. WineSOFT’s knowledge is based on the expertise of TCP/IP, VPN, SSL, peer-to-peer, mob...
The Internet of Things can drive efficiency for airlines and airports. In their session at @ThingsExpo, Shyam Varan Nath, Principal Architect with GE, and Sudip Majumder, senior director of development at Oracle, discussed the technical details of the connected airline baggage and related social media solutions. These IoT applications will enhance travelers' journey experience and drive efficiency for the airlines and the airports.
A strange thing is happening along the way to the Internet of Things, namely far too many devices to work with and manage. It has become clear that we'll need much higher efficiency user experiences that can allow us to more easily and scalably work with the thousands of devices that will soon be in each of our lives. Enter the conversational interface revolution, combining bots we can literally talk with, gesture to, and even direct with our thoughts, with embedded artificial intelligence, whic...
WebRTC sits at the intersection between VoIP and the Web. As such, it poses some interesting challenges for those developing services on top of it, but also for those who need to test and monitor these services. In his session at WebRTC Summit, Tsahi Levent-Levi, co-founder of testRTC, reviewed the various challenges posed by WebRTC when it comes to testing and monitoring and on ways to overcome them.